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%的时间)用于在单击时执行并行位图堆扫描,这是从索引扫描确定为相关的表中获取实际数据
- 按照@Bergi的建议,专门为此查询创建索引将允许PG不从表中读取数据,但这只会优化一些特定查询,请参阅官方文档
- 随机访问比顺序访问慢得多,因此您可以尝试重新排列表以优化此查询,例如,请参阅,但这附带了许多警告,可能不会长期帮助您(但有时很有用!)
- 规范化您的表,使行不会占用太多存储空间可能会有所帮助,但如果行仍然随机分布在整个表中,那么这不会有多大帮助
- 更快的IO子系统,尤其是能够更快地执行随机IO的子系统,将有助于一切,但在持续的基础上,成本显然会更高
- 缓存结果,如果您经常这样做,您可以将结果保存到不同的表(或“实体化视图”)中,并使用该表,而不是一直访问源数据
基本上,什么是“最好的”取决于很多事情,我建议你搜索我使用过的一些术语,如果你对这类东西不熟悉的话,就阅读它们你定义了什么索引吗?一个快速的猜测是,在
link\u id,insert\u date
上的索引将大大加快速度。@Bergi这样这个查询就可以只扫描索引了吗?请注意,这只会真正加快与此完全相同的查询速度,如果您从单击中引用任何其他字段,那么您很快就会遇到这种优化不适用的情况通常会有两个额外的where参数,很难准确地知道他们将提前什么。数据存储在哪种驱动器上?我正在努力区分旋转的磁盘(和相对较少的搜索)和较慢的SSD(具有大量不可预测的读取)。嗯,或者这个盒子正忙于处理其他查询?在生产中,它位于Google Cloud Postgres实例上(尽管上面的测试是在我的SSD笔记本上)。