Oracle повторно хэширует таблицу управления для каждого соединения в тех же столбцах таблицы? - PullRequest
1 голос
/ 02 июня 2010

Скажем, у вас есть следующий запрос на 9i:

SELECT /*+ USE_HASH(t2 t3) */
* FROM
table1 t1    -- this has lots of rows
LEFT JOIN table2 t2 ON t1.col1 = t2.col1
    AND t1.col2 = t2.col2
LEFT JOIN table3 t3 ON t1.col1 = t3.col1
    AND t1.col2 = t3.col2

Из-за того, что 9i не имеет RIGHT OUTER HASH JOIN, необходимо хэшировать table1 для обоих соединений. Повторно ли хешируется table1 между объединениями t2 и t3 (даже если он использует одни и те же столбцы соединения), или он сохраняет одинаковую информацию хеш-функции для обоих объединений?

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Потребуется перефразировать, поскольку второй хеш будет table3 против объединения table1 / table2, а не против table1. Или наоборот.

Например, скажем, у TABLE1 было 100 строк, у table2 - 50, а в table3 - 10. Присоединение table1 к table2 может дать 500 строк. Затем он объединяет этот результирующий набор в table3, чтобы получить (возможно) 700 строк.

Он не будет выполнять соединение table1 с table2, затем соединение table1 с table3, а затем объединение этих двух промежуточных результатов.

1 голос
/ 02 июня 2010

Посмотрите на план, он скажет вам ответ.

Примером может быть что-то вроде (я только что выдумал):

SELECT
  HASH JOIN
    HASH JOIN
      TABLE FULL SCAN table1
      TABLE FULL SCAN table2
  TABLE FULL SCAN table3

Этот пример плана включает в себя сканирование таблицы table1, хэширование его содержимого по ходу дела; просматривает таблицу 2, хэширует результаты объединения во второй хэш, а затем, наконец, сканирует таблицу 3.

Есть другие планы, из которых он может выбрать.

Если table1 - самая большая таблица, и оптимизатор знает это (из-за статистики), он, вероятно, не будет извлекать из нее данные.

...