Оптимизатор запросов

Вопросом, который обычно возникает, когда Database Engine (или любая другая система реляционной базы данных) выполняет запрос, является вопрос, как доступ к необходимым данным и обработка этих данных в запросе может быть выполнена с максимальной эффективностью. Компонент системы базы данных, ответственный за такую деятельность, называется оптимизатором запросов. Задачей оптимизатора запросов (или просто оптимизатора) является рассмотрение множества возможных стратегий выполнения поиска требуемых в запросе данных и выбор наиболее эффективной стратегии. Выбранная стратегия называется планом выполнения запроса. Оптимизатор принимает свои решения с учетом таких факторов, как: насколько велики по размерам таблицы, вовлеченные в запрос, какие существуют индексы и какие логические операции (and, or, not) используются в предложении where. Обычно такие факторы называются статистическими данными.

Оценить
(0 голоса)
Как вы уже знаете, хранимая процедура создается однажды и выполняется много раз. По этой причине план выполнения для хранимой процедуры (или пакета) размещается в кэше процедур. Таким образом, он может быть использован оптимизатором в любое время. Вы можете проверить кэш процедур, используя различные представления динамического управления. Одним из них является представление sys.dm_exec_query_pian, которое возвращает все планы выполнения, хранящиеся в кэше процедур вашей системы. (Планы выполнения отображаются в формате XML.) Документация Books Online содержит несколько полезных примеров использования этого представления DMV. Каждый план выполнения, хранящийся в кэше процедур, определяется по уникальному идентификатору, называемому дескриптором плана (plan handle). Представление sys. dm_exec_query_plan требует…
Оценить
(0 голоса)
Представление sys.dm_exec_query_stats возвращает общие статистические данные для кэшированных планов запросов. Это представление содержит одну строку на один оператор запроса вместе с кэшированным планом, а время жизни строк связано с самим планом. В примере 20.14 с помощью оператора cross apply выполняется «соединение» представлений sys.dm_exec_query_stats и sys.dm_exec_query_plan ДЛЯ получения планов выполнения всех кэшированных планов. Кроме того, каждый оператор SQL в многооператорной процедуре или пакете будет отображаться отдельно. (Оператор cross apply подробно обсуждается.)  
Оценить
(0 голоса)
Предыдущее представление, sys.dm_exec_query_stats, может быть использовано с некоторыми другими DMV для отображения различных свойств запросов. Другими словами, каждое DMV, которому требуется дескриптор плана для идентификации запроса, будет «соединено» с представлением sys.dm_exec_query_stats для отображения требуемой информации. Одним из таких представлений является sys.dm_exec_sqi_text. Это представление возвращает текст пакета SQL, который определяется указанным дескриптором. В документе Books Online показано множество полезных примеров, где «соединяются» представления sys.dm_exec_sql_text И sys.dm_exec_query_stats для получения текстов запросов SQL, которые были выполнены в пакетах, и предоставляют о них статистическую информацию. В отличие ОТ sys.dm_exec_sql_text представление sys.dm_exec_text_query_ plan возвращает план выполнения пакета в формате XML. Аналогично предыдущим представлениям, план задается…
Оценить
(0 голоса)
Это представление похоже на представление sys.dm_exec_query_stats. Оно возвращает общие статистические данные для кэшированных хранимых процедур. Представление содержит одну строку на каждую хранимую процедуру, время жизни строки продолжается столько времени, пока хранимая процедура остается кэшированной. Когда хранимая процедура удаляется из кэша, соответствующая строка убирается из этого представления.
Оценить
(0 голоса)
В большинстве случаев оптимизатор запросов выбирает самый быстрый план выполнения. Однако существует несколько особых ситуаций, при которых оптимизатор, по ряду различных причин, не может найти оптимальное решение. В подобных случаях вы должны применять подсказки (hint) оптимизатора, чтобы заставить его использовать конкретный план выполнения, который должен работать лучше. Подсказки оптимизатора являются необязательной частью в операторе select, которые указывают оптимизатору запросов, что нужно применять один из специфических вариантов поведения. Другими словами, при использовании подсказок оптимизатора вы не позволяете оптимизатору запросов искать и находить способ выполнения запроса, потому что вы точно говорите ему, что он должен делать.
Оценить
(0 голоса)
Вы должны использовать подсказки оптимизатора только временно и только для тестирования. Другими словами, исключите их использование в качестве постоянной части любого запроса. Существуют две причины этого высказывания. Во-первых, если вы заставляете оптимизатор использовать конкретный индекс, а несколько позже определяете другой индекс, который даст лучшие результаты производительности при выполнении запроса; здесь запрос и приложение, которому принадлежит этот запрос, не смогут использовать преимущества нового индекса. Во-вторых, Microsoft постоянно прилагает усилия, чтобы сделать оптимизатор запросов лучше. Если вы свяжете запрос с конкретным планом выполнения, то оптимизатор не сможет реализовать преимущества от новых и улучшенных возможностей в последующих версиях SQL Server. Существуют две причины,…
Оценить
(0 голоса)
Database Engine поддерживает следующие типы подсказок оптимизации: ♦ подсказки таблицы; ♦ подсказки соединения; ♦ подсказки запроса; ♦ структуры планов.
Оценить
(0 голоса)
Вы можете применить подсказки таблицы к одной таблице. Поддерживаются следующие подсказки таблицы: ♦ index; ♦ noexpand; ♦ forceseek (новое в SQL Server 2008). Подсказка index служит для указания одного или более индексов, которые затем будут использованы в запросе. Эта подсказка задается в предложении from в запросе. Вы можете использовать эту подсказку, чтобы осуществить доступ к индексу, если оптимизатор по различным причинам выбрал последовательное сканирование таблицы для данного запроса. (Подсказка index также может быть полезной для того, чтобы не позволить оптимизатору использовать другой конкретный индекс.) В примерах 20.15 и 20.16 показано использование подсказки index.   Пример 20.15 идентичен примеру 20.8, однако…
Оценить
(0 голоса)
Подсказки соединения дают указания оптимизатору запросов, как должны выполняться операции соединения в запросе. Они заставляют оптимизатор либо соединять таблицы в том порядке, в каком они указаны в предложении from оператора select, либо использовать техники выполнения соединения, явно указанные в операторе. Database Engine поддерживает несколько подсказок соединения: ♦ force order; ♦ loop; ♦ hash; ♦ merge. Подсказка force order заставляет оптимизатор выполнять соединение таблиц в том порядке, в котором они указаны в запросе. В примере 20.17 показано использование этой подсказки соединения.       Как вы можете видеть, оптимизатор выполняет операцию соединения в том порядке, в котором таблицы появляются в запросе.…
Оценить
(0 голоса)
Существует несколько подсказок запроса, которые используются для различных целей. В этом разделе рассматриваются следующие две подсказки запроса: ♦ fast; ♦ optimize for. Список всех других подсказок запроса вы можете найти в документации Books Online. Подсказка fast л указывает, что запрос оптимизируется для быстрого поиска первых л строк. После того как первые л строк будут получены, запрос продолжит свое выполнение и создаст полный набор результата. Подсказка optimize for заставляет оптимизатор запросов использовать конкретное значение для локальной переменной, когда запрос компилируется и оптимизируется. Это значение используется только в процессе оптимизации запроса, но не в процессе его выполнения. Эта подсказка запроса может быть…
© 2019 www.serversql.ru. Все права защищены.