Oracle 中的 BITMAP MERGE 和 BITMAP OR 有什么区别?

What's the difference between BITMAP MERGE and BITMAP OR in Oracle?

我在查看文档时看到,BITMAP MERGE在位图之间进行了OR操作。那么,为什么还有一个BITMAP OR呢?或者,它们之间有什么区别?

最佳

他们很相似,这是真的。

BITMAP MERGE 从返回多个位图的 单个 计划操作获取输出(例如,RANGE SCAN 操作的输出)并合并这些多个位图合二为一。

例如,假设我提交:

SELECT 'x'
FROM   t
WHERE  col1 BETWEEN 'A' and 'C'
AND    col2 = 'X';

请记住,在位图索引中,有一个位图与每个键相关联。这些是必须合并的多个位图。该计划将如下所示:

SELECT STATEMENT
  TABLE ACCESS T BY INDEX ROWID
    BITMAP CONVERSION TO ROWID
      BITMAP AND
        BITMAP MERGE
          BITMAP INDEX COL1_IDX RANGE SCAN
        BITMAP INDEX COL2_IDX SINGLE VALUE

...差不多

在这种情况下,Oracle 正在扫描 COL1 上的位图索引以获取 'A' 和 'C' 之间的不同索引键值。然后,它读取与每个值关联的位图的索引,并通过 OR.

将它们合并在一起

注意:上面例子中COL2 = 'X'的原因是因为我认为 Oracle只在需要生成单个时才使用BITMAP MERGE位图传递到需要一个的父步骤(在此示例中,该步骤是 BITMAP AND 步骤)。

将其与 BITMAP OR 计划步骤进行对比。 BITMAP ORtwo 计划操作中获取输出,each 输出单个位图。它将这些合并为单个位图。

假设我提交:

SELECT 'x'
FROM   t
WHERE  col1 = 'A'
OR     col2 = 123;

Oracle 必须从访问路径开始 -- 一种使用索引获取所需数据的方法。
在这种情况下,访问路径将是对与 COL1COL2 关联的索引的 BITMAP INDEX ... SINGLE VALUE 操作。然后它将使用 BITMAP OR 合并这两个访问路径的结果。该计划将如下所示:

SELECT STATEMENT
  TABLE ACCESS T BY INDEX ROWID
    BITMAP CONVERSION TO ROWID
      BITMAP OR
        BITMAP INDEX COL1_IDX SINGLE VALUE
        BITMAP INDEX COL2_IDX SINGLE VALUE

...或多或少(我没有实际测试过——我只是表达我的理解)