我在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百万行)。
答案 0 :(得分:1)
您可以添加索引以生成不同的执行计划:
CREATE INDEX idx ON data_table(foreign_key_id, "TimeStamp" DESC);