在一个拥有三亿条记录的大表中,我正在查询
MY_DATE
的不同值。这个列有约400个不同的值,并且已经建立了索引。这个数据库是Postgres。Select distinct MY_DATE from MY_TABLE;
该查询运行时间为22分钟。
在我的Oracle数据库中,具有完全相同数据集和相同索引定义的相同查询只需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分钟的时间,这似乎远远偏离了正常值。
请问有什么原因导致这个问题,并且我可以做些什么来解决它?
SELECT
查询,它不需要行锁定。 - Erwin Brandstetter