Простые планы
Простейшие планы состоят только из имени таблицы и следующим за ним метода извлечения.Например, для неотсортированной выборки из единственной таблицы без предложения WHERE
:
SELECT * FROM students
PLAN (students NATURAL)
План в EXPLAIN форме:
Select Expression -> Table "STUDENTS" Full Scan
Если есть предложение WHERE
вы можете указать индекс, который будет использоваться при нахождении совпадений:
SELECT *
FROM students
WHERE class = '3C'
PLAN (students INDEX (ix_stud_class))
План в EXPLAIN форме:
Select Expression -> Filter -> Table "STUDENTS" Access By ID -> Bitmap -> Index "IX_STUD_CLASS" Range Scan (full match)
Директива INDEX
может использоваться также для условий соединения (которые будут обсуждаться чуть позже). Она содержит список индексов, разделённых запятыми.
Директива ORDER
определяет индекс, который используется при сортировке набора данных, если присутствуют предложения ORDER BY
или GROUP BY
:
SELECT *
FROM students
PLAN (students ORDER pk_students)
ORDER BY id
План в EXPLAIN форме:
Select Expression -> Table "STUDENTS" Access By ID -> Index "PK_STUDENTS" Full Scan
Инструкции ORDER
и INDEX
могут быть объединены:
SELECT *
FROM students
WHERE class >= '3'
PLAN (students ORDER pk_students INDEX (ix_stud_class))
ORDER BY id
План в EXPLAIN форме:
Select Expression -> Filter -> Table "STUDENTS" Access By ID -> Index "PK_STUDENTS" Full Scan -> Bitmap -> Index "IX_STUD_CLASS" Range Scan (lower bound: 1/1)
В инструкциях ORDER
и INDEX
разрешено указывать один и тот же индекс:
SELECT *
FROM students
WHERE class >= '3'
PLAN (students ORDER ix_stud_class INDEX (ix_stud_class))
ORDER BY class
План в EXPLAIN форме:
Select Expression -> Filter -> Table "STUDENTS" Access By ID -> Index "IX_STUD_CLASS" Range Scan (lower bound: 1/1) -> Bitmap -> Index "IX_STUD_CLASS" Range Scan (lower bound: 1/1)
Для сортировки наборов данных, когда невозможно использовать индекс (или вы хотите подавить его использование), уберите инструкцию ORDER
и предварите выражение плана инструкцией SORT
:
SELECT *
FROM students
PLAN SORT (students NATURAL)
ORDER BY name
План в EXPLAIN форме:
Select Expression -> Sort (record length: 128, key length: 56) -> Table "STUDENTS" Full Scan
Или когда индекс используется для поиска:
SELECT *
FROM students
WHERE class >= '3'
PLAN SORT (students INDEX (ix_stud_class))
ORDER BY name
План в EXPLAIN форме:
Select Expression -> Sort (record length: 136, key length: 56) -> Filter -> Table "STUDENTS" Access By ID -> Bitmap -> Index "IX_STUD_CLASS" Range Scan (lower bound: 1/1)
Обратите внимание, что инструкция SORT
, в отличие от ORDER
, находится за пределами скобок.Это отражает тот факт, что строки данных извлекаются неотсортированными и сортируются впоследствии.
При выборке из представления указывается само представление и участвующее в нем таблица.Например, если у вас есть представление FRESHMEN
, которое выбирает только студентов первокурсников:
SELECT *
FROM freshmen
PLAN (freshmen students NATURAL)
План в EXPLAIN форме:
Select Expression -> Table "STUDENTS" as "FRESHMEN" Full Scan
Или, например:
SELECT *
FROM freshmen
WHERE id > 10
PLAN SORT (freshmen students INDEX (pk_students))
ORDER BY name DESC
План в EXPLAIN форме:
Select Expression -> Sort (record length: 144, key length: 24) -> Filter -> Table "STUDENTS" as "FRESHMEN" Access By ID -> Bitmap -> Index "PK_STUDENTS" Range Scan (lower bound: 1/1)
Обратите внимание: если вы назначили псевдоним таблице или представлению, то в предложении PLAN
необходимо использовать псевдоним, а не оригинальное имя.