Postgres DB对类似查询的响应不一致

时间:2018-08-15 06:23:37

标签: database postgresql amazon-rds

我在Amazon RDS上托管了一个Postgres数据库,具有150GB的笔触,8GB的RAM和2vCPU。到目前为止,该数据库具有一个包含320列和2000万行的表。我面临的问题是,随着我们开始插入更多数据,数据库查询的响应时间已大大减少。数据库响应为1800万行时非常快。但是在插入另外200万行之后,性能下降了很多。我做了一个简单的查询,如下所示

explain analyze SELECT * from "data_table" WHERE foreign_key_id = 7 ORDER BY "TimeStamp" DESC LIMIT 1;

对以上内容的回答如下

Limit  (cost=0.43..90.21 rows=1 width=2552) (actual time=650065.806..650065.807 rows=1 loops=1)
  ->  Index Scan Backward using "data_table_TimeStamp_219314ec" on data_table  (cost=0.43..57250559.80 rows=637678 width=2552) (actual time=650065.803..650065.803 rows=1 loops=1)
        Filter: (asset_id = 7)
        Rows Removed by Filter: 4910074
Planning time: 44.072 ms
Execution time: 650066.004 ms

我对另一个外键运行了另一个具有不同ID的查询,结果如下所示

explain analyze SELECT * from "data_table" WHERE foreign_key_id = 1 ORDER BY "TimeStamp" DESC LIMIT 1;

Limit  (cost=0.43..13.05 rows=1 width=2552) (actual time=2.749..2.750 rows=1 loops=1)
  ->  Index Scan Backward using "data_table_TimeStamp_219314ec" on data_table  (cost=0.43..57250559.80 rows=4539651 width=2552) (actual time=2.747..2.747 rows=1 loops=1)
        Filter: (asset_id = 1)
Planning time: 0.496 ms
Execution time: 2.927 ms

如您所见,两个相同类型的不同查询给出了截然不同的结果。 Foreign_key_id = 1的记录数为1100万,而Foreign_key_id = 7的记录数为100万。

我无法弄清楚为什么会这样。除foreign_key_id = 1之外,所有foreign_key_id的响应都存在巨大延迟。第一个查询有一行,其中过滤器删除了行。在第二个查询中不存在。

有人可以帮助我理解这个问题吗?

其他信息 使用btree索引时间戳 每10分钟执行一次少量的数据插入。有时我们还会使用脚本插入批量数据(5-6百万行)。

1 个答案:

答案 0 :(得分:1)

您可以添加索引以生成不同的执行计划:

CREATE INDEX idx ON data_table(foreign_key_id, "TimeStamp" DESC);