当我查看文档时,我发现BITMAP MERGE在位图之间执行OR操作。那么,为什么还有一个BITMAP OR?或者,它们之间有什么区别?
最佳
答案 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
...或多或少(我实际上没有测试过-我只是在传达我的理解)