【发布时间】:2019-09-03 13:39:03
【问题描述】:
在 Postgres 数据库中,我在一个包含 3 亿行的大表中查询 MY_DATE 的不同值。大约有 400 个,MY_DATE 列已编入索引。
Select distinct MY_DATE from MY_TABLE;
查询运行 22 分钟。
在我的 Oracle DB 上使用完全相同的数据集和相同的索引定义的相同查询运行 11 秒。
查询计划显示查询正在使用索引:
EXPLAIN Select distinct MY_DATE from MY_TABLE LIMIT 200;
给予:
QUERY PLAN
Limit (cost=0.57..7171644.14 rows=200 width=8)
-> Unique (cost=0.57..15419034.24 rows=430 width=8)
-> Index Only Scan using idx_obsdate on my_table (cost=0.57..14672064.14 rows=298788038 width=8)
当我限制结果时,查询会变得更快。脑电图
Select distinct MY_DATE from MY_TABLE LIMIT 5;
在亚秒内运行。
但是:
Select distinct MY_DATE from MY_TABLE LIMIT 50;
已经需要几分钟了。使用LIMIT 子句,时间似乎呈指数增长。
我希望 Postgres 查询能在几秒钟内运行,就像我的 OracleDB 一样。 20 分钟的索引扫描——即使是一个大表——似乎也太离谱了。
有什么建议是什么导致了这个问题以及我能做什么?
【问题讨论】:
-
@GordonLinoff:Postgres 具有仅索引扫描。对于
SELECT查询,它不需要行锁。
标签: sql postgresql indexing query-optimization distinct