尽管存在相关索引,但 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 不存在

优化 PostgreSQL 中的 JOIN -> GROUP BY 查询:所有索引都已经存在

尽管存在数据,但在 GraphQL 查询中日期字段返回为空

在 PostgreSQL 中索引空值

PostgreSQL中如何查询索引的元数据

此查询的 Postgresql 索引?