我有一张table叫 modifications
42列84m行。总大小为64gb。
我在amazonrds上运行postgres9.6.11,在db.m4.xlarge示例上有16gb的ram。
当我运行一个简单的 SELECT count(*) FROM modifications;
完成执行需要380秒。
当我跑的时候 SELECT * FROM modifications WHERE post_date = '2016-05-03';
要限制为单个日期,返回结果中的460万行需要156秒。
当我将结果集进一步限制到大约1百万行时,查询仍然需要超过100秒才能完成。
我知道这是一个很大的结果集,但是我对数据库查询性能测试还比较陌生,所以我想要一些关于尝试什么的建议。
我已经跑了 EXPLAIN ANALYZE
但我不知道该怎么办。其中许多查询非常简单,没有明确的方法来重新构造它们以提高性能。
我还尝试添加更多索引…我在每个最常查询的列上都有索引。
我使用的是aws-rds-postgresql配置的默认设置,并尝试调整 work_mem
设置使用 SET LOCAL work_mem = 'XXXMB'
. 这并没有造成什么影响。其他默认设置,如 shared_buffers
(0.5gb)和 effective_cache_size
(0.5gb)设置合理。
任何关于如何解决这一问题的建议或策略都将不胜感激。请让我知道在评论中,如果我应该包括更多的信息。
编辑:这是去年的执行计划 SELECT
查询
Bitmap Heap Scan on modifications (cost=479407.01..1692971.07 rows=460492 width=279)
Recheck Cond: ((post_date = '2016-05-03 00:00:00'::timestamp without time zone) AND (change_type = 'residence_address_line_1'::text))
-> BitmapAnd (cost=479407.01..479407.01 rows=460492 width=0)
-> Bitmap Index Scan on modifications_post_date_idx (cost=0.00..130733.87 rows=4478040 width=0)
Index Cond: (post_date = '2016-05-03 00:00:00'::timestamp without time zone)
-> Bitmap Index Scan on modifications_change_type_idx (cost=0.00..348442.64 rows=8677610 width=0)
Index Cond: (change_type = 'residence_address_line_1'::text)
1条答案
按热度按时间xcitsw881#
你应该打开音轨计时,然后你应该这样做
EXPLAIN (ANALYZE, BUFFERS)
查看查询的性能。对于您显示了其计划的查询,最好在其上有一个多列索引
(change_type, post_date)
. 但是要有数百个多列索引来支持数百个不同的查询是不可行的。所以你应该看看EXPLAIN (ANALYZE, BUFFERS)
对于该查询,同时使用多列索引和两个单列索引。您列出了3个截然不同的查询。哪一个像你最关心的人?通常需要优化查询以获得所需的结果,但不能根据查询的易优化程度来选择不同的查询。