Подробное объяснение плана выполнения Oracle

задняя часть SQL Oracle продукт
Подробное объяснение плана выполнения Oracle
---
Автор: ТТТ БЛОГ
Адрес этой статьи:blog.ChinaUnix.net/U3/107265/Да…
---
Введение:
В этой статье подробно представлены связанные концепции плана выполнения оракула, метод доступа к данным, связь между таблицами и так далее.
И есть резюме и обзоры для легкого понимания и запоминания!
+++
содержание
---
один. родственные понятия
Концепция Ровида
Концепция рекурсивного SQL
Предикат (предикат)
DRiving Table (приводной стол)
Зондовая таблица
Составной индекс
Селективность

два. Как получить доступ к данным в Oracle
1) Полное сканирование таблицы (Full Table Scans, FTS)
2) Доступ к таблице по ROWID (доступ к таблице по ROWID или поиск по rowid)
3) Сканирование индекса (сканирование индекса или поиск по индексу). Существует 4 типа сканирования индекса:
(1) Уникальное сканирование индекса (уникальное сканирование индекса)
(2) Сканирование диапазона индексов (сканирование диапазона индексов)
Используйте сканирование диапазона индексов для неуникальных индексов. 3 случая использования индексного ранжирования:
(a) Оператор диапазона (> >=
(b) В составном индексе для запроса используются только некоторые столбцы, в результате чего запрашивается несколько строк.
(c) Любой запрос к неуникальному индексированному столбцу.​
(3) Полное сканирование индекса (полное сканирование индекса)
(4) Быстрое полное сканирование индекса

В-третьих, связь между таблицами

1, Сортировка - - Объединение слиянием (Sort Merge Join, SMJ)
2, вложенные циклы (NL)
3, хэш-соединение (Hash-соединение, HJ)
Кроме того, декартово произведение (декартово произведение)

Кратко о методе подключения Oracle
    
Краткий обзор плана выполнения Oracle

+++

один. родственные понятия
 
Концепция Rowid:rowid — это псевдостолбец.Так как это псевдостолбец, этот столбец не определяется пользователем, а добавляется самой системой. Для каждой таблицы существует псевдостолбец rowid, но значение столбца ROWID физически не хранится в таблице. Однако вы можете использовать его как любой другой столбец, но вы не можете удалить или изменить столбец, а также вы не можете изменить или вставить значение столбца. Как только строка данных вставляется в базу данных, идентификатор строки уникален в течение всего времени жизни строки, то есть идентификатор строки не изменится, даже если строка генерирует миграцию строки.
Основные понятия рекурсивного SQL : Иногда для выполнения SQL-оператора, выданного пользователем, Oracle должен выполнить некоторые дополнительные операторы, которые мы называем «рекурсивными вызовами» или «рекурсивными операторами SQL». Например, когда выдается оператор DDL, ORACLE всегда неявно запускайте некоторые рекурсивные операторы SQL для изменения информации словаря данных, чтобы пользователь мог успешно выполнить оператор DDL. Рекурсивные вызовы часто возникают, когда необходимая информация словаря данных отсутствует в разделяемой памяти. вызовы будут считывать информацию словаря данных с жесткого диска в память. Пользователей не волнует выполнение этих рекурсивных операторов SQL.При необходимости ORACLE автоматически выполнит эти операторы внутри. Конечно, как операторы DML, так и SELECT могут вызывать рекурсивный SQL.Проще говоря, мы можем думать о триггерах как о рекурсивном SQL.
Row Source (источник строк): используемый в запросе набор подходящих строк, возвращенный предыдущей операцией, то есть набор всех данных строк таблицы; это также может быть набор части данных строк таблицы. таблица; это также может быть Соответствие последним 2 строкам Коллекция данных строк, полученных после того, как источник выполняет операцию соединения (например, соединение соединения).
Предикат (предикат): Где ограничения в запросе
Стол для вождения : Эта таблица также называется OUTER TABLE. Эта концепция используется во вложенных и HASH-соединениях. Если источник строк возвращает больше данных строк, это отрицательно скажется на всех последующих операциях. Обратите внимание, что хотя она переводится как управляющая таблица, на самом деле более точно переводить ее как управляющий источник строк. Вообще говоря, после применения ограничений запроса в качестве управляющей таблицы возвращается таблица с меньшим количеством источников строк, поэтому, если большая таблица имеет ограничения в условии WHERE (например, эквивалентные ограничения), большая таблица также используется в качестве управляющей таблицы. управляющая таблица. Уместно, поэтому в качестве управляющей таблицы можно использовать не только меньшую таблицу. Правильным утверждением должно быть то, что после применения ограничений запроса таблица с меньшим количеством источников строк возвращается в качестве управляющей таблицы. в исполнении В плане это должен быть источник верхнего ряда, а конкретные указания будут даны позже. В нашем последующем описании эта таблица обычно упоминается как источник строк 1 операции соединения.
Зондовая таблица: Таблица также известна как внутренняя таблица (INNER TABLE). После того, как мы получим данные конкретной строки из таблицы драйвера, найдем в таблице строку, удовлетворяющую условию соединения. Таким образом, таблица должна быть большой (на самом деле это должна быть таблица, которая возвращает более крупный источник строк), и должны быть индексы для соответствующих столбцов. В нашем последующем описании эта таблица обычно упоминается как источник строк 2 операции соединения.
Составной индекс : индекс, состоящий из нескольких столбцов, например, создать индекс idx_emp для emp (col1, col2, col3, ...), тогда мы называем индекс idx_emp составным индексом. В составном индексе есть важное понятие: ведущий столбец, в приведенном выше примере столбец col1 является ведущим столбцом. Когда мы запрашиваем, мы можем использовать «где col1 =?» или «где col1 = ? и col2 =?», такие ограничения будут использовать индексы, но «где col1 = ? и col2 =?» столбец2 = ? " не будет использовать индекс, поэтому, когда ограничение содержит начальный столбец, ограничение будет использовать составной индекс.
селективность: Сравните количество уникальных ключей в столбце с количеством строк в таблице, чтобы определить селективность столбца. Если отношение «количество уникальных ключей/количество строк в таблице» столбца ближе к 1, то селективность столбца выше, столбец больше подходит для создания индекса, а селективность индекса также выше. Когда запрос выполняется по столбцу с высокой избирательностью, возвращается меньше данных, и более подходит использование индексного запроса.

два. Как получить доступ к данным в оракуле
 
1) Полное сканирование таблицы (FTS)
Чтобы добиться полного сканирования таблицы, Oracle считывает все строки в таблице и проверяет, удовлетворяет ли каждая строка ограничению WHERE инструкции.Операция многоблочного чтения может позволить одному вводу-выводу считывать несколько блоков данных (параметр db_block_multiblock_read_count параметр), вместо чтения только одного блока данных, что значительно снижает общее количество операций ввода-вывода и повышает пропускную способность системы, поэтому метод многоблочного чтения позволяет очень эффективно добиться полного сканирования таблицы, и только в полная таблица Операция многоблочного чтения может использоваться только в случае сканирования. В этом режиме доступа каждый блок данных считывается только один раз.
Предварительные условия для использования FTS: не рекомендуется использовать полное сканирование больших таблиц, за исключением случаев, когда данные извлекаются более чем на 5–10 % от общего объема или если вы хотите использовать функцию параллельного запроса.
Пример использования полного сканирования таблицы:
 
SQL> объясните план select * from dual;
План запроса
-----------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость =
ДОСТУП К СТОЛУ ПОЛНЫЙ ДВОЙНОЙ

2) Доступ к таблице по ROWID (доступ к таблице по ROWID или поиск по rowid)
Ряд rowid отметил, что находятся файл данных, блок данных и строка в блоке, поэтому данные доступа могут быть быстро находятся в целевых данных через ROWID, что является самым быстрым способом доступа Oracle к однопрочемным данным.
Этот метод доступа не использует операцию многоблочного чтения, один ввод-вывод может прочитать только блок данных. Мы часто будем видеть методы доступа, такие как запрос данных через индекс в плане выполнения.
Метод использования доступа ROWID:
SQL> объяснить план выбора * из отдела, где rowid = ''AAAAyGAADAAAAATAAF'';
 
План запроса
------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Cost=1
ДОСТУП К ТАБЛИЦАМ ОТДЕЛА ROWID [АНАЛИЗИРОВАНО]

3) Index Scan (индексное сканирование или поиск по индексу)
Сначала мы находим значение rowid, соответствующее данным через индекс (для неуникального индекса может быть возвращено несколько значений rowid), а затем напрямую получаем конкретные данные из таблицы по rowid.Этот метод поиска называется сканирование индекса или поиск по индексу (поиск по индексу). Идентификатор строки однозначно представляет строку данных, а блок данных, соответствующий строке, получается через один ввод-вывод В этом случае этот ввод-вывод будет считывать только один блок базы данных.
В индексе, помимо хранения значения каждого индекса, индекс также хранит значение ROWID, соответствующее строке с этим значением.
Сканирование индекса может состоять из 2 шагов:
(1) Просканируйте индекс, чтобы получить соответствующее значение rowid.
(2) Прочитать определенные данные из таблицы через найденный rowid.
  每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的 I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这 是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% —— 10%,使用索引扫描会效率下降很多。 Как показано ниже:
SQL> объяснить план выбора empno, ename from emp, где empno=10;
План запроса
------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Cost=1
ДОСТУП К ТАБЛИЦАМ ROWID EMP [АНАЛИЗИРОВАНО]
ИНДЕКС УНИКАЛЬНОГО СКАНИРОВАНИЯ EMP_I1

Однако, если все запрошенные данные могут быть найдены в индексе, второго шага можно избежать, а также можно избежать ненужных операций ввода-вывода.В настоящее время, даже если при сканировании индекса извлекается много данных, эффективность еще очень высока.
SQL> EXPLAIN План выбора Empno из Emp, где Empno = 10; - запрашивать только значение столбца Empno
План запроса
------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Cost=1
ИНДЕКС УНИКАЛЬНОГО СКАНИРОВАНИЯ EMP_I1

Кроме того, если столбец индекса отсортирован в операторе SQL, поскольку индекс уже предварительно отсортирован, нет необходимости сортировать столбец индекса в плане выполнения.
SQL> объяснить план для выбора empno, ename из emp
ГДЕ Empno> 7876 ЗАКАЗАТЬ по Empno;
План запроса
-------------------------------------------------- ------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость=1
ДОСТУП К ТАБЛИЦАМ ROWID EMP [АНАЛИЗИРОВАНО]
ИНДЕКС ДИАПАЗОНА СКАНИРОВАНИЯ EMP_I1 [АНАЛИЗИРОВАНО]

Как видно из этого примера: поскольку индекс уже отсортирован, подходящие строки будут запрашиваться в порядке индекса, что позволит избежать дальнейших операций сортировки.
Тип индекса, где разные ограничения, есть четыре типа сканирования индекса:
Уникальное сканирование индекса (Index Unique Scan)
сканирование диапазона индекса
полное сканирование индекса
индексировать быстрое полное сканирование

(1) Уникальное сканирование индекса (уникальное сканирование индекса)
Нахождение стоимости с помощью уникального индекса часто возвращает одну ROWOID. Oracle часто реализует уникальное сканирование, если есть уникальное или первичное ограничение ключей (что гарантирует, что оператор обращается только к одной строке).
Примеры уникальных ограничений:
SQL> объяснить план
выберите empno, переименуйте из emp, где empno=10;
План запроса
------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Cost=1
ДОСТУП К ТАБЛИЦАМ ROWID EMP [АНАЛИЗИРОВАНО]
ПОКАЗАТЕЛЬ УНИКАЛЬНОЕ СКАНИРОВАНИЕ EMP_I1

(2) Сканирование диапазона индексов (сканирование диапазона индексов)
Используя индекс для доступа к нескольким строкам данных, типичным случаем использования сканирования диапазона индекса для уникального индекса является использование операторов диапазона (таких как >, , >=, Пример использования сканирования диапазона индекса:
SQL> объяснить план выбора empno, ename из emp
где empno > 7876 порядок по empno;
План запроса
-------------------------------------------------- ------------------------------
Выберите оператор [Выбрать] Стоимость = 1.
ДОСТУП К ТАБЛИЦАМ ROWID EMP [АНАЛИЗИРОВАНО]
ИНДЕКС ДИАПАЗОНА СКАНИРОВАНИЯ EMP_I1 [АНАЛИЗИРОВАНО]

В неуникальных индексах предикат col = 5 может возвращать несколько строк данных, поэтому для неуникальных индексов используется сканирование диапазона индексов.
3 случая использования индексного ранжирования:
(a) Оператор диапазона (> >= (b) В составном индексе для запроса используются только некоторые столбцы, в результате чего запрашивается несколько строк.
(c) Любой запрос к неуникальному индексированному столбцу.

(3) Полное сканирование индекса (полное сканирование индекса)
Полному сканированию таблицы также соответствует полное сканирование индекса. Более того, запрашиваемые в это время данные должны быть получены непосредственно из индекса.
Пример полного сканирования индекса:
Полное сканирование индекса не выполняется одноблочный ввод-вывод, поэтому он может оказаться неэффективным.
например
Индекс BE_IX представляет собой конкатенированный индекс для big_emp (empno, ename)
SQL> объясните план выбора empno, ename из big_emp в порядке empno, ename;
Запрос План
-------------------------------------------------- ------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость = 26
ИНДЕКС ПОЛНОЕ СКАНИРОВАНИЕ BE_IX [АНАЛИЗИРОВАНО]

(4) Быстрое полное сканирование индекса
Сканирование всех блоков данных в индексе аналогично полному сканированию индекса, но с одним существенным отличием: запрашиваемые данные не сортируются, т. е. данные не возвращаются в отсортированном порядке. В этом методе доступа можно использовать многоблочное чтение или параллельное чтение, чтобы максимизировать пропускную способность и сократить время выполнения.
Пример быстрого сканирования индекса:
Индекс BE_IX представляет собой многоколоночный индекс: big_emp (empno, имя)
SQL> объяснить план выбора empno, ename from big_emp;
План запроса
--------------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость=1
ИНДЕКС БЫСТРОЕ ПОЛНОЕ СКАНИРОВАНИЕ BE_IX [АНАЛИЗИРОВАНО]

Чтобы выбрать только второй столбец многоколоночного индекса:
SQL> объяснить план выбора ename из big_emp;
План запроса
--------------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость=1
ИНДЕКС БЫСТРОЕ ПОЛНОЕ СКАНИРОВАНИЕ BE_IX [АНАЛИЗИРОВАНО]

В-третьих, связь между таблицами
 
Соединение — это предикат, который пытается объединить две таблицы. Одновременно можно соединить только две таблицы. Соединение таблиц также можно назвать ассоциацией таблиц. В следующем описании мы будем использовать «источник строк» ​​вместо «таблица», потому что использование источника строк является более строгим, а два источника строк, участвующих в соединении, называются источником строк 1 и источником строк 2. Процесс соединения Каждый шаг часто представляет собой последовательную операцию, даже если к связанным источникам строк можно обращаться параллельно, то есть данные двух источников строк, соединенных соединением, можно читать параллельно, но данные, соответствующие ограничениям в таблице считывается в память.После источника строки другие шаги соединения обычно являются последовательными. Есть несколько способов объединить 2 стола, конечно, каждый метод имеет свои преимущества и недостатки, и каждый тип соединения может использовать свои преимущества только при определенных условиях.
Порядок соединений между источниками строк (таблицами) очень сильно влияет на эффективность запроса. При первом доступе к определенной таблице, то есть с использованием таблицы в качестве управляющей таблицы, сначала могут быть применены некоторые ограничения, чтобы получить меньший источник строк, что делает соединение более эффективным, что мы часто говорим о выполнении в первую очередь. , Причина ограничения. Как правило, ограничения на таблицу в предложении where применяются, когда таблица считывается в память.
В соответствии с различием операторов в условиях соединения двух источников строк, соединение можно разделить на равносоединение (например, WHERE A.COL3 = B.COL4), неравноправное соединение (WHERE A.COL3 > B.COL4) , Внешнее соединение (ГДЕ A.COL3 = B.COL4(+)). Принципы соединения вышеуказанных соединений в основном одинаковы, поэтому для простоты ниже приведен пример эквивалентного соединения.
В следующем введении в качестве примера для иллюстрации используется следующий Sql:
ВЫБЕРИТЕ A.COL1, B.COL2
ОТ А, Б
ГДЕ A.COL3 = B.COL4;
Если предположить, что таблица A является строкой-источником1, то ее соответствующий столбец сопоставления операции соединения имеет значение COL 3;
Таблица B — это строка Source2, тогда ее соответствующий столбец ассоциации операции соединения — COL 4;

Тип соединения:
На данный момент, независимо от оператора соединения, существует 3 типичных типа соединения:
Сортировка - - Объединение слиянием (Sort Merge Join (SMJ))
Вложенные циклы (NL)
Хэш-соединение
Кроме того, существуетДекартово произведение (Cartesian product), вообще старайтесь избегать его использования.

1. Сортировка - - слияние присоединиться (сортировка слияния присоединиться, SMJ)
Процесс внутреннего подключения:
1) Сначала сгенерируйте данные, необходимые для строки source1, а затем отсортируйте данные в соответствии со связанным столбцом (например, A.col3) операции соединения.
2) Затем создайте данные, необходимые для строки source2, а затем отсортируйте данные в соответствии со связанным столбцом (например, B.col4) операции соединения, соответствующей сортировке source1.
3) Наконец, отсортированные строки с обеих сторон объединяются для выполнения операции слияния, то есть два источника строк соединяются в соответствии с условием соединения.

Ниже приведено графическое представление шагов подключения:
ОБЪЕДИНИТЬ
/\
СОРТИРОВАТЬ
||
Источник строки 1 Источник строки 2

Если источник строк был отсортирован по столбцу, связанному с соединением, операции соединения не нужно выполнять операцию сортировки, что может значительно повысить скорость соединения этой операции соединения, поскольку сортировка является чрезвычайно ресурсоемкой операцией, особенно для большой стол. Предварительно отсортированный источник строк включает столбцы, которые уже были проиндексированы (например, индекс для a.col3 или b.col4), или источник строк был отсортирован на предыдущем шаге. Хотя процесс слияния двух источников строк является последовательным, возможен параллельный доступ к обоим источникам строк (например, параллельное чтение данных, параллельная сортировка).
Пример подключения SMJ:
SQL> объяснить план для
Выбрать
/*+ ordered */ е.дептно, д.дептно
от emp e, отдел d
где e.deptno = d.deptno
заказ по е.дептно, д.дептно;
План запроса
-------------------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Стоимость = 17
MERGE JOIN
СОРТИРОВАТЬ ПРИСОЕДИНИТЬСЯ
ДОСТУП К ТАБЛИЦАМ ПОЛНЫЙ EMP [АНАЛИЗИРОВАНО]
СОРТИРОВАТЬ ПРИСОЕДИНИТЬСЯ
ДОСТУП К ТАБЛИЦАМ ПОЛНАЯ ОТДЕЛКА [АНАЛИЗИРОВАНО]

Сортировка — это трудоемкая и ресурсоемкая операция, особенно для больших таблиц. По этой причине SMJ часто не является особенно эффективным методом соединения, но если оба источника строк предварительно отсортированы, этот метод соединения достаточно эффективен.

2. Вложенные циклы (NL)
Этот метод соединения имеет концепцию таблицы драйверов (внешней таблицы). Фактически процесс подключения представляет собой 2-х уровневый вложенный цикл, поэтому чем меньше количество внешних циклов, тем лучше, именно поэтому мы используем небольшую таблицу или таблицу, которая возвращает меньший источник строк в качестве управляющей таблицы (для внешний цикл) теоретическая основа. Но эта теория является лишь общим руководством, потому что следование этой теории не всегда гарантирует, что оператор будет генерировать наименьшее количество операций ввода-вывода. Иногда несоблюдение этого обоснования может привести к повышению эффективности. Если используется этот метод, важно решить, какую таблицу использовать в качестве управляющей таблицы. Иногда, если таблица драйверов выбрана неправильно, это приводит к очень плохой производительности оператора.
Процесс внутреннего подключения:
Ряд Строка 1 источника 1 — Зонд -> Строка источника 2.
Ряд 2 строки источника 1 —— Датчик -> Ряд источника 2
Строка 3 строки источника 1 — датчик -> строка источника 2.
…….
Ряд n строки источника 1 —— Датчик -> Ряд источника 2

С точки зрения процесса внутреннего соединения, необходимо использовать каждую строку в строке source1 для соответствия всем строкам в строке source2, поэтому сохранение строки source1 как можно меньше и эффективный доступ к строке source2 (обычно реализованный по индексу) заключается в том, чтобы повлиять на это Ключевой вопрос эффективности соединения. Это только теоретическое руководство по минимизации количества физических операций ввода-вывода для всей операции подключения и, как правило, минимизации общего количества физических операций ввода-вывода, если следовать этому принципу. Но если вы не будете следовать этому правилу, вы можете реализовать операцию соединения с меньшим количеством физических операций ввода-вывода, а затем нарушить правило! Поскольку минимальное количество физических операций ввода-вывода — это реальная рекомендация, которой мы должны следовать., такой пример дан в следующем анализе конкретного случая.
В процессе подключения выше мы называем Source Source1 таблицу привода или внешнюю таблицу. Source2 Source2 называется созданной таблицей или внутренней таблицей.
В соединении NESTED LOOPS Oracle считывает каждую строку в строке source1, затем проверяет наличие соответствующей строки в строке source2, все совпадающие строки помещаются в результирующий набор, а затем обрабатывает следующую строку в строке source1. Этот процесс продолжается до тех пор, пока не будут обработаны все строки в строке source1. Это один из самых быстрых способов получить первую совпадающую строку из операции соединения, и этот тип соединения можно использовать в инструкциях, требующих быстрого отклика, где главной целью является быстродействие.
Если исходный источник строк (внешняя таблица) невелик, а во внутреннем источнике строк (внутренней таблице) имеется уникальный индекс или очень избирательный неуникальный индекс, этот метод можно использовать для повышения эффективности. Одно из преимуществ NESTED LOOPS по сравнению с другими методами подключения заключается в том, что он может сначала возвращать подключенные строки, не дожидаясь обработки всех операций подключения перед возвратом данных, что может обеспечить быстрое время отклика.
Если параллельные операции не используются, лучшими ведущими таблицами являются те, которые могут возвращать меньше строк данных после применения ограничений where, поэтому большие таблицы также могут называться ведущими таблицами, в зависимости от ограничений. Для параллельных запросов мы часто выбираем большие таблицы в качестве управляющей таблицы, потому что большие таблицы могут использовать все преимущества параллельных возможностей. Конечно, иногда использование параллельных операций для запросов не обязательно более эффективно, чем неиспользование параллельных операций для запросов, потому что в итоге может быть только несколько строк в таблице, удовлетворяющих ограничениям, и это зависит от того, поддерживает ли ваша конфигурация оборудования параллелизм (например, есть ли несколько процессоров, несколько контроллеров жестких дисков), поэтому нам нужно решать конкретные проблемы.
Пример подключения NL:
SQL> объяснить план для
Выберите A.DNAME, B.SQL
из отдела a, emp b
где а.дептно = б.дептно;
План запроса
-------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Стоимость = 5
NESTED LOOPS
ДОСТУП К ТАБЛИЦАМ ПОЛНАЯ ОТДЕЛКА [АНАЛИЗИРОВАНО]
ДОСТУП К ТАБЛИЦАМ ПОЛНЫЙ EMP [АНАЛИЗИРОВАНО]

3. Хэш-соединение (HJ)
Это объединение было введено после oracle 7.3, теоретически более эффективно, чем NL и SMJ, и используется только в оптимизаторе CBO.
Меньший источник строк используется для построения хэш-таблицы и растрового изображения, а второй источник строк используется для обработки и сопоставления с хэш-таблицей, сгенерированной первым источником строк, для дальнейших объединений. Bitmap используется как относительно быстрый метод поиска для проверки наличия соответствующей строки в хеш-таблице. В частности, при хешировании Этот метод поиска более полезен, когда таблица достаточно велика, чтобы поместиться в памяти. Этот метод подключения также имеет концепцию так называемой таблицы драйверов в соединении NL.Таблица, построенная как хэш-таблица и растровое изображение, является таблицей драйверов.Когда построенная хэш-таблица и растровое изображение могут быть размещены в памяти, эффективность этот метод подключения Очень высокий.

Пример HASH-соединения:
SQL> объяснить план для
Выбрать
/*+ use_hash(emp) */ empno
от эмп, отдел
где emp.deptno = dept.deptno;
План запроса
----------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ[ВЫБЕРИТЕ] Стоимость=3
HASH JOIN
СТОЛ ДОСТУП ПОЛНЫЙ ОТДЕЛ
ДОСТУП К ТАБЛИЦАМ ПОЛНЫЙ EMP

Чтобы хэш-соединение было действительным, вам нужно установить HASH_JOIN_ENABLED=TRUE, что по умолчанию равно TRUE. При работе в большой памяти слишком маленькие параметры сделают производительность хэш-соединения еще ниже, чем другие методы соединения.

Кроме того, декартово произведение
Когда два источника ряда связаны, но между ними отсутствуют состояние ассоциации, декартовому продукту осуществляется в двухрядных источниках, что обычно вызывается упущением в письменном виде (то есть программист, забыл написать состояние ассоциации) Отказ Каждая картезианская продукция - это то, где каждый ряд один стол совпадает со всеми строками в другой таблице в свою очередь. В особых случаях мы можем использовать картезианский продукт, например, в звездном соединении, кроме того, мы должны постараться не использовать декартовому продукту, в противном случае думайте, что будет результатом!
Обратите внимание, что в следующем утверждении нет подключения между 2 таблицами.
SQL> объяснить план для
выберите emp.deptno, dept, deptno
от эмп, отдел
План запроса
------------------------
ВЫБЕРИТЕ ЗАЯВЛЕНИЕ [ВЫБЕРИТЕ] Стоимость = 5
MERGE JOIN CARTESIAN
СТОЛ ДОСТУП ПОЛНЫЙ ОТДЕЛ
СОРТИРОВАТЬ ПРИСОЕДИНИТЬСЯ
ДОСТУП К ТАБЛИЦАМ ПОЛНЫЙ EMP

Ключевое слово CARTESIAN задает декартово произведение между двумя таблицами. Если в таблице emp n строк, а в таблице dept m строк, результатом декартова произведения будет n * m строк.

Напоследок подытожим, какой способ подключения в каком случае лучше:

Sort Merge Join (Сортировка слиянием, SMJ):
а) Для неэквивалентного соединения эффективность этого метода соединения относительно высока.
б) Это работает лучше, если есть индексы для связанных столбцов.
c) Для подключения двух больших рядных источников этот метод подключения лучше, чем подключение NL.
d) Но если источник строк, возвращаемый слиянием сортировки, слишком велик, это приведет к снижению производительности базы данных, когда для запроса данных в таблице используется слишком много идентификаторов строк из-за чрезмерного ввода-вывода.

Вложенные циклы (NL):
а) Если исходный источник строк (внешняя таблица) относительно мал и имеет уникальный индекс во внутреннем источнике строк (внутренние таблицы) или очень избирательный неуникальный индекс, использование этого метода может повысить эффективность.
б) Преимущество вложенных циклов, которого нет у других методов подключения, заключается в том, что он может сначала возвращать подключенные строки, не дожидаясь обработки всех операций подключения перед возвратом данных, что может обеспечить быстрое время отклика.

Хэш-соединение (HJ):
а) Этот метод был введен позже в oracle7 и использует более продвинутую теорию соединения.Вообще говоря, его эффективность должна быть лучше, чем у двух других соединений, но это соединение можно использовать только в оптимизаторе CBO, и для него необходимо установить соответствующий hash_area_size Параметр может обеспечить лучшую производительность.
b) Относительно хорошая эффективность может быть достигнута при соединении между двумя большими источниками строк, а более высокая эффективность может быть достигнута, когда один источник строк мал.
c) может использоваться только в равноправном соединении


+++
Обзор планов выполнения Oracle
---

Связанные концепции плана выполнения Oracle:

Rowid: Система для каждой дополнительной строки оракула фиктивный столбец данных, таблица данных содержит имя, идентификатор базы данных, база данных, хранящая серийный номер и другой идентификатор информации, уникальный жизненный цикл строки rowid.
Recursive sql : Для выполнения оператора пользователя система дополнительно выполняет оператор дополнительной операции, такой как ведение словаря данных.
Row source(Источник строки): на этапе выполнения Oracle набор допустимых строк, возвращенный предыдущей операцией.
Predicate (предикат): ограничение после где.
Driving table(Управляющая таблица): также известное как соединение с внешней таблицей, в основном для вложенного хеш-соединения. Обычно применяется после ограничения, возвращает меньшее количество строк в таблице в качестве основного источника таблицы. В последующем описании упоминается операция соединения источника 1 строки таблицы управления.
Probed table (Таблица зондирования): внутренняя таблица соединения, после того как мы получим определенную строку данных из управляющей таблицы, найдем подходящую строку в зондируемой таблице, поэтому таблица должна быть большим источником строк и соответствовать условию соединения. В столбце должен быть индекс. В последующем описании эта таблица обычно упоминается как источник строк 2 операции соединения.
Concatenated index (Комбинированный индекс): если индекс состоит из нескольких столбцов, он называется составным индексом.Первый столбец составного индекса является ведущим столбцом, и индекс доступен только в том случае, если предикат содержит ведущий столбец.
Избирательность: если количество различных значений столбца в таблице/общее количество строк в таблице близко к 1, селективность столбца высокая.

Методы доступа к данным доступа Oracle:
 
Полное сканирование таблицы, FTS (полное сканирование таблицы): Установив db_block_multiblock_read_count, можно установить количество блоков данных, которые могут быть прочитаны одним IO, тем самым эффективно уменьшив общее количество IO при полном сканировании таблицы, то есть блоки данных, к которым нужно получить доступ, считываются в память заранее через механизм упреждающего чтения. Операции многоблочного чтения можно использовать только в случае полного сканирования таблицы.
Доступ к таблице по строке (доступ к таблице по строке, поиск по строке) : поскольку идентификатор строки записывает расположение хранилища строк, это самый быстрый способ для оракула получить доступ к одной строке данных.
Сканирование индекса (Поиск индекса сканирования): В индексе, помимо хранения значения каждого индекса, индекс также хранит значение rowid, соответствующее строке с этим значением.Сканирование индекса разделено на два этапа: 1, сканирование индекса для получения rowid; 2 , прочитать конкретные данные через rowid. Каждый шаг — это отдельный IO, поэтому, если общий объем данных, отфильтрованных по условиям ограничения, превышает 5–10 % от общего количества строк в исходной таблице, эффективность использования индексного сканирования сильно упадет. Однако, если все результирующие данные могут быть найдены в индексе, второй операции можно избежать, тем самым ускорив скорость поиска.
Существует 4 типа сканирования индекса в зависимости от типа индекса и ограничений:
Уникальное сканирование индекса: возвращает содержимое данных одного идентификатора строки при наличии уникального или первичного ключа.
Сканирование диапазона индексов: 1, оператор диапазона (>,,>=,я полное сканирование индекса: Все запрашиваемые данные можно получить из индекса.
Указатель быстрого сканирования (индекс Fast Scan): И полное сканирование индекса похоже, но это неправильный способ сортировки результатов.

На данный момент существует 3 типичных типа подключения:
 
Сортировка слиянием (SMJ sort-merge join): сначала создайте данные, требуемые управляющей таблицей, а затем отсортируйте данные в соответствии со столбцами, связанными с операцией соединения; затем создайте данные, необходимые для зондируемой таблицы, а затем отсортируйте данные в соответствии со столбцом операции соединения, соответствующим управляющей таблице. ; Строки объединяются для выполнения операции слияния. Сортировка — это трудоемкая и ресурсоемкая операция, особенно для больших таблиц. Таким образом, smj обычно не является особенно эффективным методом соединения, но если управляющая и зондируемая таблицы предварительно отсортированы, этот метод соединения также более эффективен.
Вложенные петли (NL вложенные петли) : Процесс подключения - это процесс выполнения вложенного петля между таблицей вождения и исследованной таблицей. Это необходимо использовать каждую строку таблицы вождения, чтобы соответствовать всем строкам зонтомной таблицы. Вложенные петли могут сначала вернуть подключенные строки вместо того, чтобы ждать всех операций соединения, чтобы завершить до возвращения данных, которые могут добиться быстрого времени отклика.
Хэш-соединение : меньший источник строк используется для построения хэш-таблицы и растрового изображения, а второй источник строк используется для хеширования и сопоставления с хэш-таблицей, созданной первым источником строк. для дальнейших подключений. Этот метод подключения чрезвычайно эффективен, когда построенная хеш-таблица и растровое изображение могут быть размещены в памяти. Но для этого необходимо установить соответствующий параметр hash_area_size, и его можно использовать только в эквивалентном соединении.
Кроме того, существует тип подключения:Декартово произведение (Декартово произведение) : Каждая строка таблицы по очереди соответствует всем строкам другой таблицы. В общем, старайтесь избегать ее использования.

Пожалуйста, указывайте при репосте:
Эта статья взята из БЛОГА TTT, исходный адрес: http://blog.chinaunix.net/u3/107265/showart_2192657.html.