从哪里开始诊断postgresql性能问题?

ncgqoxb0  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(360)

我有一张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)
xcitsw88

xcitsw881#

你应该打开音轨计时,然后你应该这样做 EXPLAIN (ANALYZE, BUFFERS) 查看查询的性能。
对于您显示了其计划的查询,最好在其上有一个多列索引 (change_type, post_date) . 但是要有数百个多列索引来支持数百个不同的查询是不可行的。所以你应该看看 EXPLAIN (ANALYZE, BUFFERS) 对于该查询,同时使用多列索引和两个单列索引。
您列出了3个截然不同的查询。哪一个像你最关心的人?通常需要优化查询以获得所需的结果,但不能根据查询的易优化程度来选择不同的查询。

相关问题