1

У меня есть большая таблица фактов с 300-миллиметровыми рядами и 50 столбцами. В этой таблице есть несколько отчетов, и каждый отчет использует только пару из 50 столбцов из таблицы.Может ли растровое изображение слияния оракула во время быстрого полного сканирования?

Каждый столбец в таблице фактов индексируется BITMAP INDEX. Идея состоит в том, чтобы использовать эти индексы как одностолбцовую версию исходной таблицы, предполагая, что оракул может легко объединить BITMAP INDEX.

Если я использую несколько столбцов из таблицы в инструкции WHERE, я вижу, что оракул может эффективно объединить эти индексы. Существует BITMAP AND операции в плане выполнения, как ожидалось.

Если я использую несколько столбцов из таблицы в SELECT заявления, я могу видеть, что в зависимости от столбцов селективности, оракул либо выполнить ненужный TABLE ACCESS или BITMAP CONVERSION [to rowids], а затем HASH JOIN этих преобразований.

Есть ли способ устранить HASH JOIN в случае присоединения нескольких BITMAP INDEX es? Есть ли намек на оракул, чтобы заставить BITMAP MERGE, когда столбцы отображаются в SELECT, а не WHERE?

Наглядно это кажется как HASH JOIN для BITMAP INDEX хся ненужная операции в SELECT заявлении, принимая во внимание, что на самом деле не нужно в WHERE заявления. Но я не мог найти никаких доказательств того, что оракул может это избежать.

Вот некоторые примеры:

SELECT a, b, c /* 3 BITMAP CONVERSIONs [to rowids] and then 2 unneeded HASH JOINS */ 
    FROM fact; 

SELECT a, b, c, d, e /* TABLE ACCESS [full] instead of reading all the data from indexes */ 
    FROM fact; 

SELECT a /* BITMAP INDEX [fast full scan] as expected*/ 
    FROM fact 
    WHERE b = 1 and c = 2; /* BITMAP AND over two BITMAP INDEX [single value] as expected */ 

Есть ли какие-либо намеки оптимизировать примеры # 1 и # 2?

В производстве я использую oracle11g, но я пробовал подобные запросы на oracle12c, и это похоже, что в обеих версиях oracle ведут себя одинаково.

+0

Можете ли вы разместить полный запрос? Я не уверен, что означает получение ненужных HASH JOINS, если вы только выбираете из FACT? – BobC

+0

@BobC, полный запрос здесь не нужен, так как я могу проиллюстрировать проблему на меньшем примере. У меня есть следующий запрос: 'SELECT a, b FROM fact;'. Существует 2 'BITMAP INDEX' для' a' и 'b', а oracle считывает значения из этих индексов вместо таблицы' fact' (поскольку в таблице содержится много других столбцов). Затем я предполагаю, что оракул должен выполнить «BITMAP MERGE» для соответствия значениям из 'a' со значениями в' b'. Но oracle выполняет 'BITMAP CONVERSION [to rowids]', а затем вместо 'HASH JOIN'; что неэффективно для «ИНДЕКСОВ БИТМАПА». –

ответ

1

После некоторого исследования похоже, что oracle12c не может соединяться с BITMAP INDEX es, если они используются в статье SELECT эффективно.

В этом случае нет выделенного пути доступа, чтобы присоединиться к BITMAP INDEX es в пункте SELECT, и поэтому в этом случае используется HASH JOIN.

Oracle не может использовать BITMAP MERGE путь доступа в этом случае он выполняет операцию OR между двумя точечными изображениями:

Как Bitmap Merge Работает Слияние использует OR операцию между двумя точечными изображениями. Полученная растровая карта выбирает все строки из первого растрового изображения, плюс все строки из каждого последующего растрового изображения.

Подробный анализ показал, что только HASH JOIN был рассмотрен оптимизатором затрат в моем случае. Я не смог найти никаких доказательств того, что BITMAP INDEX es может эффективно использоваться в заявлении SELECT. Oracle documentation предлагает использовать BITMAP INDEX es только в WHERE оговорка относительно размеров.

И одно из следующих условий:

  • индексированного столбца будет ограничен в запросах (упоминаемых в статье о WHERE).

или

  • индексированный столбец внешний ключ для таблицы измерений. В этом случае такой индекс скорее сделает преобразование звезды.

В моем случае это не одно из двух.

+0

Возможно, я немного плотный, но я все еще не уверен, что понимаю, в чем проблема, которую вы пытаетесь решить? Если у вас есть SELECT A, B FROM FACT (т.е. нет предложения WHERE), какой индекс вы ожидаете от Oracle? – BobC

+0

@BobC, Oracle может считывать значения из индексов на 'A' ​​и' B', вместо таблицы 'FACT', если таблица большая. В этом случае 2 индекса быстрых полных сканов намного быстрее, чем полное сканирование таблицы. Но тогда оракул использует неэффективную 'HASH JOIN' для объединения значений из 2-х индексов, где на самом деле соединение не требуется, растровые индексы имеют одинаковый порядок для ROWID. –

+0

@BobC, так, например, если вы выполняете 'SELECT A FROM FACT' (без предложения WHERE) и индексируется столбец' A', oracle выполняет 'INDEX [быстрое полное сканирование]' вместо 'TABLE ACCESS [full сканирование] '. Но тогда, если вы выберете два столбца вместо одного, и если оба индекса являются растровыми индексами, oracle выполняет ненужный «HASH JOIN» между двумя индексами. –

0

Я думаю, что вы видите по существу «путь доступа к индексу» в действии :) Oracle необходимо объединить данные из обоих сканов на ROWID, чтобы сшить строки вместе. Хеш-соединение - единственный метод, открытый для Oracle. Тот факт, что вы используете растровые индексы, фактически не имеет значения; вы видите такое же поведение с индексами b-tree

------------------------------------------------------------------------------------------- 
| Id | Operation    | Name    | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |     | 1973K| 43M| 137K (30)| 00:00:06 | 
| 1 | VIEW     | index$_join$_001 | 1973K| 43M| 137K (30)| 00:00:06 | 
|* 2 | HASH JOIN   |     |  |  |   |   | 
|* 3 | INDEX FAST FULL SCAN| IO    | 1973K| 43M| 17201 (78)| 00:00:01 | 
|* 4 | INDEX FAST FULL SCAN| IT    | 1973K| 43M| 17201 (78)| 00:00:01 | 
------------------------------------------------------------------------------------------- 
+0

Как я уже сказал, «HASH JOIN' для« ИНДЕКСА BITMAP »кажется мне неэффективным, потому что бит в каждой растровой карте в каждом индексе« BITMAP INDEX »той же таблицы должен уже имеют одинаковый порядок, они сортируются по 'ROWID'. Нет смысла конвертировать «ROWID» в хэши, а затем присоединяться к нему, поскольку биты в одной позиции принадлежат одной и той же строке во всех индексах. Но, как я описал в своем ответе, у oracle нет специального пути для этого случая и используется более общее и, следовательно, неэффективное «HASH JOIN». –

+0

Я не уверен, что вы получите «лучший» ответ от поддержки; они по сути являются «исправлением ошибок». Поскольку он работает «как запроектировано», я сомневаюсь, что вы получите много усилий, если не сможете продемонстрировать большое влияние на производительность. Я задал еще один набор вопросов для вас в своих комментариях ниже вашего собственного ответа. – BobC

 Смежные вопросы

  • Нет связанных вопросов^_^