Поведение вложенных циклов множественных объединений Oracle - временный набор результатов или конвейер - PullRequest
0 голосов
/ 11 октября 2018

Учитывая следующий пример запроса:

 SELECT * FROM (SELECT * FROM A
  JOIN B ON B.AID=A.ID JOIN C ON C.BID=B.ID) WHERE ROWNUM < 100

И при условии, что все эти таблицы имеют огромное количество строк.

Если я форсирую вложенные циклы (используя подсказку use_nl или FIRST_ROWS) - тогда запрос эффективно ищет только первые 100 соответствующих записей, как и ожидалось - по сравнению с хеш-соединением, которое всегда должно загружать таблицы в память.

Что меня действительно смущает, так это то, что согласно всем учебникам, которые я прочитал, - прежде чем присоединиться к C, Oracle должен сначала завершить объединение A и B и только затем соединить временный набор результатов с C.

В этом примереэто определенно не работает, иначе запрос будет выполняться очень медленно.Похоже, что он обрабатывает строки один за другим - то есть, как в конвейере.Но я не могу найти подтверждения этому поведению.

Было бы замечательно, если бы кто-то разъяснил мне это.

Заранее спасибо.

...