尽管存在相关索引,但 PostgreSQL 查询速度很慢
Posted
技术标签:
【中文标题】尽管存在相关索引,但 PostgreSQL 查询速度很慢【英文标题】:Despite the existence of relevant indices, PostgreSQL query is slow 【发布时间】:2021-11-15 10:07:20 【问题描述】:我有一个包含 3 列的表格:
时间(时间戳) 价格(数字(8,2)) set_id (int)该表包含 740 万条记录。 我为时间创建了一个简单的索引,为 set_id 创建了一个索引。 我想运行以下查询:
select * from test_prices where time BETWEEN '2015-06-05 00:00:00+00' and '2020-06-05 00:00:00+00';
根据我的索引,查询需要 2 分 30 秒。 查看解释分析统计:https://explain.depesz.com/s/ZwSH
GCP postgres DB 具有以下统计信息:
我在这里想念什么?为什么这个查询这么慢,我该如何改进?
【问题讨论】:
谓词选择性约为 50%(大约每隔一行应该返回一次),因此索引不会提高查询性能,因为 DBMS 必须先读取索引记录,然后再读取相应的表记录。因此它与读取整个表格几乎相同 【参考方案1】:根据您的解释计划,该行将返回 450 万行中的 160 万行。这意味着正在返回很大一部分行。
Postgres 明智地决定全表扫描比使用索引更有效,因为很有可能无论如何都需要读取所有数据页。
令人惊讶的是,您为查询报告了 00:02:30。解释是说查询在大约 1.4 秒内完成——这似乎是合理的。
我怀疑经过的时间是由于返回的数据量大(可能行很宽)、与数据库的网络连接缓慢或数据库/服务器争用造成的。
【讨论】:
为了隔离问题,我在超高速服务器上进行了查询。仍然需要6-7秒。列也不是很宽。我的 postgres 数据库托管在 GCP 上,我刚刚附上了该实例的统计信息。有问题吗?【参考方案2】:您的查询选择了表的三分之二。顺序扫描是处理此类查询的最有效方式。
您的查询在 2 秒内执行。一定是您的客户端需要很长时间才能呈现查询结果(pgAdmin 为此而臭名昭著)。使用不同的客户端。
【讨论】:
不知道 pgAdmin 会导致这样的延迟。但是,我直接通过 psql 进行了尝试,但查询仍然需要 2 分钟。这将支持 Gordon 的假设,即我的互联网速度/连接是问题所在。你同意吗? 很可能。以上是关于尽管存在相关索引,但 PostgreSQL 查询速度很慢的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL - 尽管运行 CREATE LANGUAGE,但语言 pgplsql 不存在