Подсказка о сортировке по заданному индексу
Функция
Управление сортировкой записей в выборке данных соответственно указанному индексу без использования конструкции ORDER BY.
Спецификация
::=
Синтаксические правила
-
Подсказка располагается перед перечислением имен выбираемых столбцов запроса на выборку данных.
-
Подсказка применяется только для именованных индексов.
-
Подсказка применяется только для одного индекса.
-
Подсказки
INDEX
иINDEX_ASC
эквивалентны.
Общие правила
-
В случае невозможности произвести сортировку по указанному индексу подсказка игнорируется.
-
Подсказка задает сортировку с использованием указанного индекса. Сортировка с подсказкой (с использованием индекса) в некоторых случаях будет выполняться быстрее, чем сортировка с помощью конструкции
ORDER BY
(например, в случае, когда выбираемые записи для результирующей выборки хранятся последовательно в нескольких блоках файла данных таблицы). -
В общем случае запросы с подсказками сортировки будут работать несколько медленнее, чем запросы без подсказок (несортированные) из-за дополнительной сортировки.
-
Использование подсказки вместе с конструкцией
ORDER BY
бессмысленно, т.к. в этом случае будет проведена повторная сортировка. -
В ряде случаев подсказка будет игнорироваться (например, когда для обработки запроса ядру СУБД ЛИНТЕР требуется предварительная сортировка).
Пример
create or replace table test( id int, ident int ); create or replace table test1( id int, ident int ); insert into test( id, ident) values ( 1, 2 ); insert into test( id, ident) values ( 2, 3 ); insert into test( id, ident) values ( 3, 1 ); insert into test1( id, ident) values ( 1, 1 ); create index "AAA" on test(ident, id); create or replace table test2( id2 int, ident2 int ); insert into test2( id2, ident2) values ( 1, 3 ); insert into test2( id2, ident2) values ( 2, 1 ); insert into test2( id2, ident2) values ( 3, 2 ); create index "AAA2" on test2(ident2, id2); select /*+INDEX_DESC(system.test aaa)*/ * from test where ident is not null; select /*+INDEX_DESC(system .test aaa)*/ a.id, a.ident from test a, test1 b where b.ident is not null; select /*+INDEX_DESC(system.test aaa )*/ a.id, a.ident from test a, test1 b; select /*+INDEX(system.test aaa)*/ * from test1 b, test a; select /*+ INDEX(TEST AAA)*/* from test, test2 where id=id2;