Они очень похожи, это правда.
BITMAP MERGE
получает выходные данные из операции single plan, которая вернула несколько битовых карт (например, выходные данные операции 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
, чтобы получить различные значения ключа индекса между«А» и «С».Затем он считывает индекс для растровых изображений, связанных с каждым значением, и объединяет их вместе с помощью OR
.
ПРИМЕЧАНИЕ. Причина для COL2 = 'X'
в приведенном выше примере заключается в том, что я думаю Oracle использует BITMAP MERGE
только в том случае, если ему нужно сгенерировать единственное растровое изображение для перехода к родительскому шагу, который требует его (в этом примере этот шаг является BITMAP AND
шагом).
Сравните это с шагом плана BITMAP OR
.BITMAP OR
принимает вывод из двух плановых операций, которые каждая выводит одно растровое изображение.Он объединяет их в одно растровое изображение.
Предположим, я отправляю:
SELECT 'x'
FROM t
WHERE col1 = 'A'
OR col2 = 123;
Oracle должен начать с пути доступа - способа использования индекса для получения необходимых данных.
В этом случае путем доступа будет операция BITMAP INDEX ... SINGLE VALUE
для индексов, связанных с COL1
и COL2
.Затем он будет использовать 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
... более или менее (я на самом деле не проверял это - я просто передаю свое понимание)