Что такое «SQL-подсказки»? - PullRequest
4 голосов
/ 04 ноября 2008

Я сторонник ORM-решений и время от времени провожу семинар по Hibernate.

Говоря о сгенерированном фреймворком SQL, люди обычно начинают говорить о том, как им нужно уметь использовать "подсказки", и это предположительно невозможно с ORM-фреймворками.

Обычно что-то вроде: «Мы пробовали Hibernate. Вначале это выглядело многообещающе, но когда мы выпустили его из нашей очень очень сложной производственной базы данных, оно сломалось, потому что мы не смогли применить подсказки!».

Но когда спрашивают о конкретном примере, память об этих людях вдруг становится не такой ясной ...

Я обычно чувствую себя запуганным, потому что вся эта "подсказка" - для меня звучит как вуду ... Так кто-нибудь может просветить меня? Что подразумевается под SQL-подсказками или DB-подсказками?

Единственное, что я знаю, это что-то вроде подсказки, это SELECT ... UPDATE. Но это поддерживается Hibernate-API ...

Ответы [ 5 ]

10 голосов
/ 04 ноября 2008

Оператор SQL, особенно сложный, на самом деле может быть выполнен механизмом БД любым количеством различных способов (какую таблицу в объединении сначала прочитать, какой индекс использовать на основе множества различных параметров и т. Д.).

Опытный dba может использовать подсказки, чтобы поощрять механизм БД выбирать конкретный метод, когда он генерирует свой план выполнения. Обычно вам нужно будет сделать это только после тщательного тестирования и анализа конкретных запросов (поскольку механизмы БД обычно чертовски хороши в определении оптимального плана выполнения).

Некоторые специфичные для MSSQL обсуждения и синтаксис здесь:
http://msdn.microsoft.com/en-us/library/ms181714.aspx

Редактировать: некоторые дополнительные примеры на
http://geeks.netindonesia.net/blogs/kasim.wirama/archive/2007/12/31/sql-server-2005-query-hints.aspx

8 голосов
/ 04 ноября 2008

Подсказки к запросам используются для управления оптимизатором запросов, когда он по умолчанию не создает разумных планов запросов. Сначала небольшой фон в оптимизаторах запросов:

Программирование баз данных отличается практически от любой другой разработки программного обеспечения, поскольку оно имеет механический компонент. Поиск диска и задержка вращения (ожидание прибытия определенного сектора под головку диска) очень дороги по сравнению с процессором. Разные стратегии разрешения запросов приводят к разным объемам ввода-вывода, часто радикально различным. Правильное или неправильное понимание этого может существенно повлиять на производительность запроса. Для обзора оптимизации запросов см. Этот документ.

SQL является декларативным - вы задаете логику запроса и позволяете СУБД выяснить, как ее решить. Современный оптимизатор запросов на основе затрат (в некоторых системах, таких как Oracle также имеется устаревший оптимизатор запросов, сохраненный для обратной совместимости), выполнит серию преобразований в запросе. Они поддерживают семантическую эквивалентность, но различаются по порядку и выбору операций. Опираясь на статистику, собранную по таблицам (размеры, гистограммы распределения ключей), оптимизатор вычисляет оценку объема работы, необходимой для каждого плана запроса. Он выбирает наиболее эффективный план.

Оптимизация на основе затрат является эвристической и зависит от точной статистики. С ростом сложности запросов эвристика может создавать неправильные планы, которые потенциально могут быть крайне неэффективными.

Подсказки к запросу могут использоваться в этой ситуации для принудительного использования определенных стратегий в плане запроса, например типа объединения. Например, для запроса, который обычно возвращает очень маленькие результирующие наборы, вы можете захотеть принудительно соединить вложенные циклы. Вы также можете задать определенный порядок объединения таблиц.

O / R mappers (или любой инструмент, который генерирует SQL) генерирует свой собственный запрос, который, как правило, не содержит информации хинтинга. В случае, если этот запрос выполняется неэффективно, у вас есть ограниченные опции, некоторые из которых:

  • Изучите индексацию по таблицам. Возможно, вы можете добавить индекс. Некоторые системы (например, последние версии Oracle) позволяют индексировать объединения по нескольким таблицам.

  • Некоторые системы управления базами данных (опять же, на ум приходит Oracle) позволяют вручную связывать план запроса с определенной строкой запроса. Планы запроса кэшируются значением хэша запроса. Если запросы являются параметризованными, базовая строка запроса является постоянной и преобразуется в одно и то же значение хеш-функции.

  • В качестве крайней меры вы можете изменить схему базы данных, но это возможно только при управлении приложением.

Если вы управляете SQL, вы можете подсказывать запросы. На практике это довольно редко нужно делать. Более распространенный режим отказов в O / R-преобразователях со сложными схемами базы данных состоит в том, что они могут затруднять выражение сложных предикатов запроса или выполнять сложные операции над большими массивами данных.

Я склоняюсь к тому, чтобы использовать O / R mapper для 98% работы, для которой он подходит, и переходить к хранимым процедурам, где они являются подходящим решением. Если вам действительно нужно намекнуть на запрос, это может быть подходящей стратегией. Если в вашем приложении нет ничего необычного (например, DSS), вам следует только нужно убежать из O / R Mapper в меньшинстве ситуаций. Вы могли бы также Выясните (опять же, примером могли бы быть инструменты DSS, работающие с данными в совокупности), что маппер O / R не совсем подходящая стратегия для приложения.

4 голосов
/ 04 ноября 2008

Хотя HINTS и делают, как описывают другие ответы, вы должны использовать их только в редких, исследованных обстоятельствах. 9 раз из 10 подсказка приведет к плохому плану запросов. Если вы действительно не знаете, что делаете, не используйте их.

3 голосов
/ 04 ноября 2008

Не существует такого понятия, как «оптимизированный код SQL», потому что код SQL никогда не выполняется.

Код SQL переводится оптимизатором в план выполнения. Оптимизатор будет использовать информацию, которую он должен выбрать (среди прочего).

  • порядок, в котором задействованы таблицы
  • метод соединения для каждой задействованной таблицы (вложенный / слияние / хэш)
  • как получить доступ к данным таблицы (прямой доступ к таблице / индекс с просмотром закладок / прямой доступ к индексу) (сканирование / поиск)
  • следует ли использовать параллелизм и когда заканчивать параллелизм (собирать потоки)

Подсказки к запросам позволяют программисту игнорировать (в большинстве случаев) или вежливо предлагать (в других случаях) выбор оптимизатора.

Советы по запросам могут позволить вам отключить параллелизм, заставить все объединения быть реализованными как вложенный цикл, заставить один индекс использоваться над другим ... как несколько примеров.

Так как оптимизатор действительно хорош , если кто-то отвергает оптимизатор, он обычно запрашивает неоптимальный план. Подсказки к запросу лучше всего подавать, когда у оптимизатора нет необходимой информации для правильного выбора.

Одно из мест, где я использую подсказки для запросов, - для переменных таблицы. Предполагается, что переменные таблицы имеют 0 строк в оптимизаторе, поэтому оптимизатор всегда объединяет табличные переменные с использованием вложенного цикла (наилучшая реализация объединения для небольшого числа строк). Если у меня есть большая табличная переменная - она ​​уже упорядочена в подходящем порядке для объединения слиянием, я могу указать использование объединения слиянием, применив подсказку запроса.

3 голосов
/ 04 ноября 2008

Все современные СУБД имеют своего рода оптимизатор запросов, который вычисляет лучший план запроса, который представляет собой последовательность операций чтения / записи, необходимых для выполнения запроса SQL.

Иногда планы могут быть неоптимальными, поэтому разработчики СУБД включили «подсказки» в SQL. Подсказки - это инструкции, которые вы можете встраивать в свой SQL, которые влияют на оптимизатор запросов. С помощью подсказок вы можете давать инструкции оптимизатору запросов, например, какие индексы следует использовать, в каком порядке следует читать данные из таблиц, ...

Таким образом, с помощью подсказок вы можете устранить некоторые узкие места, которые оптимизатор запросов не может решить самостоятельно.

Например, вот список подсказок Oracle .

...