Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres在日期查询时忽略聚集索引_Sql_Postgresql_Indexing_Clustered Index - Fatal编程技术网

Sql Postgres在日期查询时忽略聚集索引

Sql Postgres在日期查询时忽略聚集索引,sql,postgresql,indexing,clustered-index,Sql,Postgresql,Indexing,Clustered Index,我有一个很大的表,我会定期运行查询,如选择日期>日期“2001-01-01”。我试图通过在date_att上对表进行聚类来提高这些查询的速度,但是当我通过explain Analysis运行这些查询时,它仍然选择顺序扫描表,即使是从date_att>date'2001-01-01'的表中选择date_att这样简单的查询。为什么会这样?我知道,由于查询返回表的很大一部分,优化器将忽略索引,但由于表是由该属性聚集的,它是否能够真正快速地对表进行二进制搜索,直到日期>2001-01-01,然后返回所

我有一个很大的表,我会定期运行查询,如选择日期>日期“2001-01-01”。我试图通过在date_att上对表进行聚类来提高这些查询的速度,但是当我通过explain Analysis运行这些查询时,它仍然选择顺序扫描表,即使是从date_att>date'2001-01-01'的表中选择date_att这样简单的查询。为什么会这样?我知道,由于查询返回表的很大一部分,优化器将忽略索引,但由于表是由该属性聚集的,它是否能够真正快速地对表进行二进制搜索,直到日期>2001-01-01,然后返回所有结果?此查询所需的时间与不使用群集时一样长。

您似乎混淆了两个概念:

表的PostgreSQL聚类

根据PostgreSQL中的索引对表进行聚类将表行的顺序(存储在堆表中)与聚类时索引中的顺序对齐。从文档中:

集群是一次性的操作:当随后创建表时 更新后,更改不会聚集。

集群可能(通常)提高范围查询的查询速度,因为所选行恰好存储在堆表的附近。没有任何东西可以保证这个订单!因此,优化器不能假设这是真的

例如,如果插入满足where子句的新行,则可能会将其插入表中的任何位置,例如存储1990年的行的位置。因此,这一假设并不成立:

但是,由于该表是按该属性聚集的,它是否能够真正快速地通过二进制>搜索表,直到日期>2001-01-01,然后返回所有结果

这就引出了您提到的另一个概念:

聚集索引

这是完全不同的,PostgreSQL根本不支持这一点,但许多其他数据库(SQL Server、带InnoDB的MySQL以及Oracle,在Oracle中称为“索引组织表”)都支持这一点

在这种情况下,表数据本身存储在索引结构中—没有单独的堆结构!由于它是一个索引,因此每个
插入
/
更新
/
删除
的顺序也会保持不变。因此,您的假设是正确的,事实上,我希望上述数据库的行为符合您的预期(假设
date
列是集群键!)


希望能澄清这一点。

你能展示一下你的表和索引定义吗?你说你在日期列上有一个聚集索引,后来你提到“顺序扫描表”,我很困惑,表扫描就是聚集索引扫描。感谢你的快速响应-表定义是:
CREATE table test(dummy_primary_key integer,date_att date,primary key(dummy_primary_key));
然后我在date_att上创建索引,并使用以下命令对其进行聚类:
在测试时创建索引dateindex(date_att)使用dateindex进行集群测试;
然后,运行
从测试中选择date\u att,其中date\u att>date'2001-01-01'
仍然需要大约10秒。测试保存大约一格数据,查询返回大约一半数据。根据我对集群索引的理解,这应该很快,但仍然很慢。嗯,恐怕这是一个错误对我来说是个谜。我对Postgresql的了解还不足以了解分析器的工作原理,有趣的是,在您发布的表定义中,索引被使用了,一旦其他列添加到表中,索引就不再被使用了,即使其他列在查询中没有被引用。奇怪的是……我只是尝试了同样的方法不管定义是什么,psql命令行和它都会扫描…无论如何,谢谢!请从
explain analyze
(或上传到)发布执行计划。不要将此作为评论发布,请编辑您的问题。您可能还想阅读此内容:@josh hull我已手动添加了您的建议编辑,因为它已被人群拒绝。愚蠢的系统。另请参见此处:那么,在PostgreSQL中对表进行群集的用例是什么?我从过去12个小时以来一直在阅读此主题,对此我完全困惑不知道w、 @KamilLatosinski我从未在任何方面使用过PostgreSQL群集。这是一个古老的功能,我怀疑它是否能与更现代的功能(如仅索引扫描)配合使用。我猜它的使用现在仅限于极少数情况。