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

时间:2019-05-03 09:39:30

标签: oracle oracle11g database-administration sql-tuning

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

最佳

1 个答案:

答案 0 :(得分:2)

它们非常相似,是真的。

BITMAP MERGE取自 single 计划操作的输出,该操作返回了多个位图(例如,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 OR

Oracle必须以访问路径开头-一种使用索引来获取其所需数据的方法。
在这种情况下,访问路径将是对与SELECT 'x' FROM t WHERE col1 = 'A' OR col2 = 123; BITMAP INDEX ... SINGLE VALUE关联的索引的COL1操作。然后它将使用COL2合并这两个访问路径的结果。该计划将如下所示:

BITMAP OR

...或多或少(我实际上没有测试过-我只是在传达我的理解)

相关问题