Оператор INDEXED BY
1. Как работает INDEXED BY
Оператор INDEXED BY заставляет планировщик запросов SQLite использовать определенный именованный индекс в операторе DELETE, SELECT или UPDATE. Оператор INDEXED BY является расширением SQLite и не переносится на другие СУБД.
Оператор "INDEXED BY имя_индекса" указывает, что именованный индекс должен быть использован для поиска значений в предыдущей таблице. Если имя_индекса не существует или не может быть использован для запроса, подготовка оператора SQL завершается с ошибкой. Оператор "NOT INDEXED" указывает, что при доступе к предыдущей таблице не должен использоваться ни один индекс, включая неявные индексы, созданные ограничениями UNIQUE и PRIMARY KEY. Однако, можно по-прежнему использовать rowid для поиска записей, даже если указано "NOT INDEXED".
Некоторые СУБД SQL предоставляют механизмы нестандартных «подсказок», которые могут помочь оптимизатору запросов выбрать индексы для конкретного оператора. Оператор INDEXED BY SQLite — это не механизм подсказок, и его не следует использовать как таковой. Оператор INDEXED BY не дает оптимизатору подсказки о том, какой индекс использовать; он задает оптимизатору требование использовать конкретный индекс. Если оптимизатор запросов не может использовать индекс, указанный в операторе INDEXED BY, запрос завершится с ошибкой.
Оператор INDEXED BY не предназначен для настройки производительности запроса. Цель оператора INDEXED BY — вызвать ошибку во время выполнения, если изменение схемы, такое как удаление или создание индекса, приведет к изменению плана запроса для временного запроса. Оператор INDEXED BY разработан для выявления нежелательных изменений плана запросов во время регрессионного тестирования. Разработчикам приложений рекомендуется не использовать INDEXED BY при проектировании, реализации, тестировании и настройке приложений. Если использовать INDEXED BY, то это следует делать на самом завершающем этапе разработки, когда дизайн «закрепляется».
2. См. также
-
В списке проверок планировщика запросов описаны шаги, которые разработчики приложений должны выполнить для решения проблем с планировщиком запросов. Обратите внимание, что использование INDEXED BY — это крайняя мера, используемая только в случае неудачи всех других способов.
-
Унарный оператор «+» может быть использован для исключения терминов в условии WHERE из использования индексов. Внимательное использование унарного + иногда может помочь предотвратить выбор плохих индексов планировщиком запросов, не ограничивая его использованием одного конкретного индекса. Более эффективным способом управления тем, какие индексы используются в запросе, является правильное размещение унарных операторов +.
-
Интерфейс C/C++ sqlite3_stmt_status() вместе с операторами SQLITE_STMTSTATUS_FULLSCAN_STEP и SQLITE_STMTSTATUS_SORT могут использоваться для обнаружения во время выполнения, когда оператор SQL не использует индексы эффективно. Многие приложения могут предпочесть использовать интерфейс sqlite3_stmt_status() для обнаружения неправильного использования индексов, а не оператор INDEXED BY, описанный здесь.
Эта страница была последним раза изменена 08.01.2022 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/lang_indexedby.html