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