【问题标题】:Understanding bitmap indexes in postgresql了解 postgresql 中的位图索引
【发布时间】:2016-01-11 02:00:57
【问题描述】:

PostgreSQL 9.4

我刚刚遇到了名为Bitmap Index Scan的节点和提到的所谓底层位图数据结构的概念in this post。据我所知,PostgreSQL 不支持创建位图索引。

问题:所以任何时候我们需要使用位图数据结构来执行Bitmap Index Scan,我们需要先构建它或者PostgreSQL在构建过程中创建它btree 索引并在表发生更改时重建它?

【问题讨论】:

    标签: sql postgresql indexing bitmap


    【解决方案1】:

    数据页的位图是根据需要(每个查询)从索引或更多索引创建的。当索引返回多于更少的行,或者在同一关系上使用两个或多个索引时使用它。位图的内容控制应该处理哪些页面以及应该跳过哪些页面。

    这种扫描方式的基本要求是表上已有索引。

    【讨论】:

    • 所以,我们在需要做Bitmap Heap Scan?的任何时候从头开始构建结构
    【解决方案2】:

    页面的位图是为每个查询动态创建的。它不会被缓存或重复使用,并在位图索引扫描结束时被丢弃。

    提前创建页面位图没有意义,因为它的内容取决于查询谓词

    假设您正在搜索x=1 and y=2xy 上有 b-tree 索引。 PostgreSQL 不会将xy 组合成一个位图然后搜索该位图。它扫描索引x 以查找具有x=1 的所有页面的页面地址,并制作一个位图,其中可能包含x=1 的页面为真。然后它扫描y 寻找y 可能等于2 的页面地址,并从中制作位图。然后它与他们查找x=1y=2 可能为真的页面。最后,它自己扫描表,只读取可能包含候选值的页面,读取每个页面并只保留x=1 and y=2 所在的行。

    现在,如果您正在寻找类似缓存的预构建位图索引,PostgreSQL 9.5 中有这样的东西:BRIN indexes。这些适用于非常大的表,并提供了一种方法来查找可以跳过的表范围,因为已知它们不包含所需的值。

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2018-04-15
      • 1970-01-01
      相关资源
      最近更新 更多