В чем разница между BITMAP MERGE и BITMAP OR в Oracle? - PullRequest
1 голос
/ 03 мая 2019

Когда я проверял документацию, я видел, что MITGE BITMAP выполняет операцию ИЛИ между битовыми картами.Итак, почему же существует БИТМА ИЛИ тогда?Или какие различия между ними?

Bests

1 Ответ

2 голосов
/ 03 мая 2019

Они очень похожи, это правда.

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

... более или менее (я на самом деле не проверял это - я просто передаю свое понимание)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...