我发现创建一个触发器只是为了获取表的当前总行数而不执行 COUNT(*) FROM table 很麻烦。我在想他们为 Postgres 8.5 计划的索引组织表是否可以实现?

有帮助吗?

解决方案

我不会想到一个索引组织表必然是更快的扫描计算所有可见的元组。从逻辑上讲,它必须经过相同的数据量,不管它是组织使得数据是B树的叶节点,或在现有的堆格式。

目前,PostgreSQL的索引仅存储[键,CTID]双(基本上)。 (A CTID本质上是一种“ROWID” - 堆页码和元组线指针指数)所以你可以通过索引去,不计算在表中的行,因为你需要检查[XMIN,XMAX]对于每个元组 - 而这仅保持与所述数据,在堆

您可以把[XMIN,XMAX]在指数中well--这茬了,不时的建议。但这种涨大的指数,并且是所有更新/删除就必须确保他们跟上最新有用:和引起的问题,这不仅是因为参与做一个更新的工作一定量乘以现在已经扩展通过对表索引的数量。在基于昂贵的用户表达重等指标上的tsvector,或1的情况下,这可能需要一段时间,并在一些棘手的情况下,根本无法工作,与行,现在看来是住在索引中,但在死堆。而这项工作的整点应该是允许数据库依靠专门在如果可能,指数实时岬信息。这一成本会即使您更新非索引column--一些团队去了一些努力,在8.3加快款项(堆仅元组)。

我想一个可能性是将标记为任选具有指数[XMIN,XMAX] - 例如只有标记p键索引的方式。那么就必须规划师的变更弄清楚的时候,这是一个优势---这似乎是相当多的工作。

索引组织的表,如果他们的工作,因为我相信他们做的Oracle(和SQL Server,其中具有聚簇索引的任何表基本上是索引组织)工作通过存储[键,元组]在主键索引,而不是(大概[键,p键]在所有其他) - 无CTID,没有堆。因此,“元组”将包含[XMIN,XMAX,cminmax,natts,...]等等,你可以只通过扫描索引满足“从表中SELECT COUNT(*)”。但是,这本质上只是一样扫描堆上的元组---他们不神奇占用较少的空间,因为他们在一个“指数”现在是。

AFAICT用于索引组织表的主要的原因是,一个小的表与单个主键索引将占用1页而不是3,和索引扫描由主密钥可以是快一点。我似乎记得在Oracle相关的咨询,我给出了IOT中是他们打算为静态维度表,而不是一般用途,部分由于对维持二级指标的费用(我不认为甲骨文店[键,p键]在IOT二次索引,而是某种替代ROWID的)。

其他提示

这已经过时了,但在 PostgreSQL 9.2 中,您可以获得仅索引扫描,也可以执行 count(*)。

也可以看看,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top