Шаги по выполнению плана
Каждый шаг плана выполнения возвращает набор строк, которые либо используются на следующем шаге, либо на последнем этапе возвращаются пользователю или приложению, выполнившему оператор SQL. Набор строк, возвращаемых каждым шагом, называется источником строк. Рисунок 5-1. Древовидная диаграмма показывает поток данных от одного обхода к другому. Нумерация каждого шага отражает порядок, в котором шаги отображаются при просмотре плана выполнения (кратко объясняется, как просмотреть план выполнения). Обычно это не тот порядок, в котором выполняется каждый шаг. Каждый шаг плана выполнения либо извлекает строки из базы данных, либо получает данные строк в качестве входных данных из одного или нескольких источников строк:
Шаги, обозначенные красными прямоугольниками, физически извлекают данные из файлов данных в базе данных. Этот шаг называется путем доступа. Пути доступа, которые можно использовать в Oracle, будут подробно описаны позже:
Шаги 3 и 6 считывают все строки из таблиц EMP и SALGRADE соответственно.
Шаг 5 ищет каждое значение DEPTNO, возвращенное шагом 3, в индексе PK_DEPTNO. Он определяет ROWID тех строк, которые связаны с таблицей DEPT.
Шаг 4 извлекает из таблицы DEPT те строки, ROWID которых возвращается на шаге 5.
Шаги, обозначенные черным текстовым полем, применяются к источнику строк, например связывание, сортировка или фильтрация между двумя таблицами. Подробные сведения будут даны позже:
Шаг 2 реализует операции вложенного цикла (эквивалент вложенных циклов в операторах C), получает источники строк из шагов 3 и 4 и сравнивает каждую строку из источника на шаге 3 с ее источником строк на шаге 4. Соответствующие строки объединяются вместе и полученные строки возвращаются на шаг 1.
Шаг 1 завершает операцию фильтра. Он получает источники строк из шагов 2 и 6, удаляет те строки из шага 2, которые имеют соответствующие строки из шага 6, и возвращает оставшиеся строки из шага 2 пользователю или приложению.
Реализуйте последовательность шагов плана выполнения.
Шаги в плане выполнения реализуются не в том порядке, в котором они пронумерованы: Oracle сначала реализует те шаги, которые отображаются в виде листьев в графе древовидной структуры на рисунке 5-1 (например, шаги 3, 5 и 6). Строки, возвращаемые каждым шагом, называются источниками строк следующего шага. Затем Oracle реализует родительский шаг.
Например, для выполнения оператора, показанного на рис. 5-1, Oracle выполняет эти шаги в следующем порядке:
Сначала Oracle реализует шаг 3 и возвращает строки результатов на шаг 2, строка за строкой.
Для каждой строки, возвращаемой на шаге 3, Oracle выполняет следующие шаги:
-- Oracle реализует шаг 5 и возвращает результат ROWID на шаг 4.
-- Oracle реализует шаг 4 и возвращает строку результата на шаг 2.
-- Oracle реализует шаг 2, принимает строку с шага 3 и строку с шага 4 и возвращает
Дайте шагу 1 строку.
-- Oracle реализует шаг 6. Если есть строка результата, верните ее на шаг 1.
-- Oracle реализует шаг 1. Если строка возвращается с шага 6, Oracle возвращает строку с шага 2 в
Пользователь, выполнивший оператор SQL.
Обратите внимание, что Oracle выполняет шаги 5, 4, 2 и 6 один раз для каждой строки, возвращаемой на шаге 3. Для выполнения многих родительских шагов требуется только одна строка из дочерних шагов. Для такого родительского шага родительский шаг (и, возможно, остальная часть плана выполнения) реализуется, как только из дочернего шага возвращается одна строка. Если родительский шаг родительского шага также можно активировать посредством возврата одной строки, то он также будет выполнен. Таким образом, выполнения можно связать в цепочку по дереву, возможно, включая остальную часть плана выполнения. Для таких операций вы можете использовать first_rows в качестве цели оптимизации, чтобы быстро реагировать на запросы пользователей.
Для каждой строки, полученной по очереди дочерним шагом, Oracle реализует родительский шаг и все объединенные шаги один раз. Родительские шаги, которые запускаются для каждой строки, возвращаемой дочерним шагом, включают доступ к таблице, доступ к индексу, соединения вложенных циклов и фильтры.
Для реализации некоторых родительских шагов требуются все строки из дочерних шагов. Для такого родительского шага Oracle не может реализовать родительский шаг до тех пор, пока все строки не будут возвращены из дочернего шага. К таким родительским шагам относятся «Сортировка», «Сортировка-объединение», «Групповая функция» и «Итог». Для такой операции first_rows нельзя использовать в качестве цели оптимизации, но all_rows можно использовать в качестве цели оптимизации, чтобы этот тип операции потреблял наименьшее количество ресурсов.
Иногда при выполнении оператора он не выполняется шаг за шагом, как указано выше, а может выполняться параллельно. Например, в реальной среде шаги 3, 5 и 4 могут выполняться параллельно для достижения большей эффективности. На приведенной выше древовидной диаграмме трудно увидеть порядок выполнения каждой операции. Однако с помощью другой формы плана выполнения, созданной ORACLE, легко увидеть, какая операция выполняется первой, а какая позже. План выполнения — это то, что нам действительно нужно, и оно будет подробно объяснено позже.
Эта статья взята из блога CSDN. При перепечатке указывайте источник: http://blog.csdn.net/lcyhjx/archive/2009/12/20/5044799.aspx.
-