- Подсказка в SQL-запросе
-
Подсказка в SQL-запросе, иначе Хинт (англ. Hint) — средство языка запросов, позволяющее явным образом влиять на план запроса.
Сам SQL-запрос содержит указание, какую информацию необходимо получить из БД, но не содержит указаний, каким образом это делать. В общем случае, СУБД, по собственным правилам, определяет план запроса и, соответственно, его выполняет. Однако на практике может возникнуть случай, что такой план запроса, в силу неучтенных СУБД факторов, несовершенства логики или сторонних требований может оказаться неоптимальным. Хинт позволяет явно вмешаться в формирование плана запроса, не полагаясь полностью на автоматику.
Синтаксис и набор подсказок не описан в стандарте SQL, он сильно зависит от конкретной реализации СУБД.
Можно выделить следующие, общие для многих РСУБД, назначения подсказок:
- указание порядка соединения таблиц
- какой метод соединения таблиц использовать
- какой индекс использовать для доступа к таблице
В некоторых случаях СУБД может проигнорировать подсказку.
Содержание
Особенности подсказок РСУБД Microsoft SQL Server
Подсказки представляют собой расширение языка c собственными ключевыми словами.
Примеры
SELECT * FROM Customers C WITH (INDEX=City) INNER LOOP JOIN Orders O ON O.CustomerID = C.CustomerID WHERE C.City = 'Madrid'
в этом запросе для Microsoft SQL Server две подсказки:
LOOP
— указывает, что соединять таблицы следует методом вложенных цикловWITH (INDEX=City)
— указывает, что для доступа к таблице Customers следует использовать индекс с названием City
Особенности подсказок РСУБД Oracle
В Oracle подсказки вставляются в текст запроса как комментарий. Текст комментария анализируется, и если обнаруживается, что это приемлемый хинт, он принимается. Благодаря такому синтаксису, запрос с подсказками может выполняться на другой СУБД без модификации, однако ответственность за оптимизацию плана в этом случае будет целиком лежать на СУБД. При таком подходе, опечатка в подсказке приводит к тому, что подсказка рассматривается сервером как простой комментарий.[1]
Примеры
SELECT /*+ full(t) */ t.name FROM tbl1 t WHERE t.DATE = SYSDATE SELECT /*+ index(t ind_date) */ t.name FROM tbl1 t WHERE t.DATE = SYSDATE
Здесь приведены подсказки:
/*+ full(t) */
— указывает, что поиск нужно вести сканированием всей таблицы/*+ index(t ind_date) */
— указывает, что поиск нужно вести по конкретному индексу
Особенности подсказок РСУБД MySQL
В версии MySQL 3.23.12 можно указывать, какие именно индексы (ключи) MySQL должен применять для извлечения информации из таблицы. [2]
TABLE_NAME [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
Примечания
Категория:- SQL
Wikimedia Foundation. 2010.