PostgreSQL如何通过AND组合多个索引的使用?

问题描述 投票:0回答:1

PostgreSQL 如何通过

AND
运算符组合使用两个 btree 索引?

我发现 Postgres 文档中的这一页非常令人惊讶,甚至令人难以置信:

https://www.postgresql.org/docs/current/indexes-bitmap-scans.html

此页面似乎表明,当查询包含子句

WHERE "col1" = 'A' AND "col2" = 'B'
时,如果
col1
col2
都被索引,则在内存中为每个子句设置一个位图(显然每行由一位组成)两个列索引,并将它们
AND
组合在一起以查找匹配行的结果集。

这对我来说似乎非常难以置信,特别是对于 btree 索引,因为这意味着查询时间和内存消耗都会随着数据库中的行数线性缩放,而不管与给定查询匹配的行数如何,这将使得Postgres 对于许多应用程序来说不可用。

请有人告诉我,仅稀疏匹配表中行的 Postgres 查询不会与数据库中的总行数线性缩放!

如果两个 btree 索引对同一个表进行索引,我更有可能相信这些索引是通过某种方式直接与 btree 节点相交来组合的(无论如何看起来!)。就我个人而言,如果我要实现这一点,我将创建一个包含数据库中唯一值的 btree,然后在每个唯一值的每个叶节点处,我将存储一堆

id
值,这些值在索引中具有给定值柱子。通过与每个表的叶节点堆相交,找到公共行将非常容易。

我检查了两个不同的 Postgres 内部文档,看看我是否能看到它是如何工作的,但我还没有找到我正在寻找的答案......

postgresql indexing query-optimization internals database-engine
1个回答
0
投票

您正在编造文档故意未提供的细节。位图仅在同一个表中组合,并且在表中,数据结构中仅存在要贡献的行的页面。对于当前的实现,贡献任何行的每个块大约需要 64 字节。由于它们纯粹位于内存结构中,因此版本之间的实现可以自由更改。文档通常不会详细介绍此类事情,因为使文档与实现中的更改保持同步是非常烦人的。

© www.soinside.com 2019 - 2024. All rights reserved.