【发布时间】:2013-12-23 00:14:32
【问题描述】:
我有一个大表,我定期运行诸如 select date_att > date '2001-01-01' 之类的查询。我试图通过在 date_att 上对表进行聚类来提高这些查询的速度,但是当我通过解释分析运行这些查询时,它仍然选择按顺序扫描表,即使是像 SELECT date_att from table where date_att > date 这样简单的查询'2001-01-01'。为什么会这样?我知道,由于查询返回表的大部分,优化器将忽略索引,但由于该表是由该属性聚集的,它不应该能够真正快速地通过表进行二进制搜索到日期> '2001-01-01' 然后返回所有结果?这个查询仍然需要和没有聚类一样多的时间。
【问题讨论】:
-
你能显示你的表和索引定义吗,你说你在日期列上有一个聚集索引,我很困惑,然后你参考“顺序扫描表”,表扫描是聚集索引扫描。
-
感谢您的快速响应- 表定义是:
CREATE TABLE test(dummy_primary_key integer, date_att date, primary key(dummy_primary_key));然后我在 date_att 上创建一个索引并使用以下命令对其进行集群:CREATE INDEX dateindex on test(date_att); CLUSTER test using dateindex;然后,运行SELECT date_att FROM test WHERE date_att > date '2001-01-01'仍然需要10 秒。测试包含大量数据,查询返回大约一半的数据。根据我对聚集索引的理解,这应该很快,但仍然很慢。 -
嗯,恐怕这对我来说是个谜。我对Postgresql知之甚少,不知道分析器是如何工作的,有趣的是,对于您发布的表定义,使用了索引,一旦将其他列添加到表中,索引就不再使用,甚至尽管查询中未引用其他列。 sqlfiddle.com/#!15/94380/1
-
奇怪...我只是在 psql 命令行上尝试了相同的操作,无论定义是什么,它都会进行 seqscans...无论如何谢谢!
-
请从
explain analyze发布执行计划(或上传到explain.depesz.com)。不要不要将此作为评论发布,编辑您的问题。您可能还想阅读以下内容:wiki.postgresql.org/wiki/Slow_Query_Questions
标签: sql postgresql indexing clustered-index