Подсказки к запросам используются для управления оптимизатором запросов, когда он по умолчанию не создает разумных планов запросов. Сначала небольшой фон в оптимизаторах запросов:
Программирование баз данных отличается практически от любой другой разработки программного обеспечения, поскольку оно имеет механический компонент. Поиск диска и задержка вращения (ожидание прибытия определенного сектора под головку диска) очень дороги по сравнению с процессором. Разные стратегии разрешения запросов приводят к разным объемам ввода-вывода, часто радикально различным. Правильное или неправильное понимание этого может существенно повлиять на производительность запроса. Для обзора оптимизации запросов см. Этот документ.
SQL является декларативным - вы задаете логику запроса и позволяете СУБД выяснить, как ее решить. Современный оптимизатор запросов на основе затрат (в некоторых системах, таких как Oracle также имеется устаревший оптимизатор запросов, сохраненный для обратной совместимости), выполнит серию преобразований в запросе. Они поддерживают семантическую эквивалентность, но различаются по порядку и выбору операций. Опираясь на статистику, собранную по таблицам (размеры, гистограммы распределения ключей), оптимизатор вычисляет оценку объема работы, необходимой для каждого плана запроса. Он выбирает наиболее эффективный план.
Оптимизация на основе затрат является эвристической и зависит от точной статистики. С ростом сложности запросов эвристика может создавать неправильные планы, которые потенциально могут быть крайне неэффективными.
Подсказки к запросу могут использоваться в этой ситуации для принудительного использования определенных стратегий в плане запроса, например типа объединения. Например, для запроса, который обычно возвращает очень маленькие результирующие наборы, вы можете захотеть принудительно соединить вложенные циклы. Вы также можете задать определенный порядок объединения таблиц.
O / R mappers (или любой инструмент, который генерирует SQL) генерирует свой собственный запрос, который, как правило, не содержит информации хинтинга. В случае, если этот запрос выполняется неэффективно, у вас есть ограниченные опции, некоторые из которых:
Изучите индексацию по таблицам. Возможно, вы можете добавить индекс. Некоторые системы (например, последние версии Oracle) позволяют индексировать объединения по нескольким таблицам.
Некоторые системы управления базами данных (опять же, на ум приходит Oracle) позволяют вручную связывать план запроса с определенной строкой запроса. Планы запроса кэшируются значением хэша запроса. Если запросы являются параметризованными, базовая строка запроса является постоянной и преобразуется в одно и то же значение хеш-функции.
В качестве крайней меры вы можете изменить схему базы данных, но это возможно только при управлении приложением.
Если вы управляете SQL, вы можете подсказывать запросы. На практике это довольно редко нужно делать. Более распространенный режим отказов в O / R-преобразователях со сложными схемами базы данных состоит в том, что они могут затруднять выражение сложных предикатов запроса или выполнять сложные операции над большими массивами данных.
Я склоняюсь к тому, чтобы использовать O / R mapper для 98% работы, для которой он подходит, и переходить к хранимым процедурам, где они являются подходящим решением. Если вам действительно нужно намекнуть на запрос, это может быть подходящей стратегией. Если в вашем приложении нет ничего необычного (например, DSS), вам следует
только нужно убежать из O / R Mapper в меньшинстве ситуаций. Вы могли бы также
Выясните (опять же, примером могли бы быть инструменты DSS, работающие с данными в совокупности), что маппер O / R не совсем подходящая стратегия для приложения.