Postgresql 以小组为单位加快研究生培养

Postgresql 以小组为单位加快研究生培养,postgresql,Postgresql,我正在尝试加速对表单的查询: EXPLAIN ANALYZE SELECT c0."insert_date" as t, count(*) FROM "clicks" AS c0 WHERE (c0."link_id" = 29) GROUP BY t ORDER BY t; Finalize GroupAggregate (cost=57016.09..57021.29 rows=208 width=12) (actual time=2068.781..2069.062 rows=183

我正在尝试加速对表单的查询:

EXPLAIN ANALYZE SELECT c0."insert_date" as t, count(*) FROM "clicks" AS c0 WHERE (c0."link_id" = 29) GROUP BY t ORDER BY t;

 Finalize GroupAggregate  (cost=57016.09..57021.29 rows=208 width=12) (actual time=2068.781..2069.062 rows=183 loops=1)
   Group Key: insert_date
   ->  Sort  (cost=57016.09..57017.13 rows=416 width=12) (actual time=2068.776..2068.840 rows=549 loops=1)
         Sort Key: insert_date
         Sort Method: quicksort  Memory: 50kB
         ->  Gather  (cost=56954.32..56998.00 rows=416 width=12) (actual time=2068.310..2178.702 rows=549 loops=1)
               Workers Planned: 2
               Workers Launched: 2
               ->  Partial HashAggregate  (cost=55954.32..55956.40 rows=208 width=12) (actual time=2061.287..2061.353 rows=183 loops=3)
                     Group Key: insert_date
                     ->  Parallel Bitmap Heap Scan on clicks c0  (cost=3939.03..55707.38 rows=49388 width=4) (actual time=148.147..2039.441 rows=40061 loops=3)
                           Recheck Cond: (link_id = 29)
                           Heap Blocks: exact=9508
                           ->  Bitmap Index Scan on clicks_link_id_index  (cost=0.00..3909.40 rows=118530 width=0) (actual time=145.150..145.150 rows=120182 loops=1)
                                 Index Cond: (link_id = 29)
 Planning time: 0.223 ms
 Execution time: 2180.492 ms
(17 rows)
当模糊不清的次数(每天的点击次数)很高时,它的速度特别慢


有没有关于如何加快这一进程的建议?(我对索引一无所知,尽管我很高兴知道索引的方向是否正确)。

一些背景知识:

  • 看起来不错,也就是说,它在猜测它将返回多少行,并且似乎正确地传播了这些信息。这一点很重要,因为查询规划器很多时候都做了“错误的事情”,因为它对表中的数据没有很好的了解

  • 1.8秒(即约90%的时间)用于在单击时执行并行位图堆扫描,这是从索引扫描确定为相关的表中获取实际数据

因此,在执行此查询时,PG可能会花费大部分时间进行IO,而只花少量时间处理数据。因此,目的是使其能够更有效地读取数据,或者只是读取更少的数据

  • 按照@Bergi的建议,专门为此查询创建索引将允许PG不从表中读取数据,但这只会优化一些特定查询,请参阅官方文档

  • 随机访问比顺序访问慢得多,因此您可以尝试重新排列表以优化此查询,例如,请参阅,但这附带了许多警告,可能不会长期帮助您(但有时很有用!)

  • 规范化您的表,使行不会占用太多存储空间可能会有所帮助,但如果行仍然随机分布在整个表中,那么这不会有多大帮助

  • 更快的IO子系统,尤其是能够更快地执行随机IO的子系统,将有助于一切,但在持续的基础上,成本显然会更高

  • 缓存结果,如果您经常这样做,您可以将结果保存到不同的表(或“实体化视图”)中,并使用该表,而不是一直访问源数据


基本上,什么是“最好的”取决于很多事情,我建议你搜索我使用过的一些术语,如果你对这类东西不熟悉的话,就阅读它们

你定义了什么索引吗?一个快速的猜测是,在
link\u id,insert\u date
上的索引将大大加快速度。@Bergi这样这个查询就可以只扫描索引了吗?请注意,这只会真正加快与此完全相同的查询速度,如果您从
单击中引用任何其他字段,那么您很快就会遇到这种优化不适用的情况通常会有两个额外的where参数,很难准确地知道他们将提前什么。数据存储在哪种驱动器上?我正在努力区分旋转的磁盘(和相对较少的搜索)和较慢的SSD(具有大量不可预测的读取)。嗯,或者这个盒子正忙于处理其他查询?在生产中,它位于Google Cloud Postgres实例上(尽管上面的测试是在我的SSD笔记本上)。