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

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

Оценить
(1 голос)
Задачей оптимизатора является разработка наиболее эффективного плана выполнения для заданного запроса. Эта задача решается с использованием следующих четырех фаз (рис. 20.1).   1. Синтаксический разбор (parsing). Проверяется синтаксис запроса, сам запрос преобразуется в дерево. После этого выполняется проверка всех объектов базы данных, на которые в запросе приводятся ссылки. (Например, проверяется существование всех столбцов, на которые ссылается запрос, и определяются их идентификаторы.) После процесса проверки формируется окончательное дерево запроса. 2. Компиляция запроса (query compilation). Дерево запроса компилируются оптимизатором запросов. 3. Оптимизация запроса (query optimization). В качестве входных данных оптимизатор запросов получает скомпилированное дерево запроса, которое было сгенерировано на предыдущем шаге, и…
Оценить
(0 голоса)
Как вы уже знаете из предыдущего раздела, фаза оптимизации запроса может быть разделена на следующие фазы: ♦ анализ запроса; ♦ выбор индекса; ♦ выбор порядка операций соединения: ♦ выбор техники (техник) для обработки операций соединения.
Оценить
(0 голоса)
В процессе анализа запроса оптимизатор проверяет запрос на аргументы поиска, использование оператора or и существование критериев соединения - именно в этом порядке. Поскольку использование оператора or и существование критериев соединения не требуют объяснения, здесь обсуждаются только аргументы поиска. Аргумент поиска является частью запроса, которая ограничивает промежуточный результирующий набор запроса. Основным назначением аргументов поиска является то, что они позволяют использовать существующие индексы применительно к конкретному выражению. Вот примеры аргументов поиска: ♦ emp_fname = 'Moser'; ♦ salary >= 50000; ♦ emp_fname = 'Moser' and salary >= 50000. Существует несколько форм выражений, которые не могут быть использованы оптимизатором в качестве аргументов поиска. К…
Оценить
(0 голоса)
Идентификация аргументов поиска позволяет оптимизатору принять решение о том, можно ли использовать один или более существующих индексов. На этой фазе оптимизатор проверяет каждый аргумент поиска на предмет, существуют ли подходящие индексы для соответствующего выражения. Если такой индекс существует, оптимизатор принимает решение, использовать его или нет. Это решение зависит от селективности соответствующего выражения. Селективность выражения определяется как отношение количества строк, удовлетворяющих условию, к общему количеству строк в таблице. Оптимизатор проверяет селективность выражения с индексированным столбцом, используя статистические данные, которые создаются для распределения значений в столбце. Оптимизатор запросов учитывает эту информацию для определения оптимального плана запроса, оценивая стоимость использования индекса для выполнения…
Оценить
(0 голоса)
Как вы уже знаете, оптимизатор использует индексы для повышения скорости выполнения запроса. Когда вы обращаетесь к таблице, у которой нет индексов, или если оптимизатор принимает решение не использовать существующий индекс, система выполняет последовательное сканирование таблицы. В процессе сканирования таблицы Database Engine последовательно читает страницы данных таблицы для поиска строк, которые принадлежат результирующему набору данных. Доступ по индексу является методом доступа, при котором система базы данных читает и записывает страницы данных с использованием индекса. Так как доступ по индексу значительно сокращает количество операций ввода/вывода, он обычно выполняется гораздо быстрее, чем сканирование таблицы. Как вы уже знаете, Database Engine использует некластеризованный индекс…
Оценить
(0 голоса)
Статистические данные индекса обычно создаются, когда создается индекс для конкретного столбца (столбцов). Создание статистических данных индекса означает, что Database Engine создает гистограмму, основанную более чем на 200 значениях столбца. (По этой причине создается более 199 интервалов.) Гистограмма указывает, помимо других вещей, как много строк в точности соответствует каждому интервалу, среднее количество строк с различными значениями внутри интервала и плотность значений. Если вы хотите явно создать статистические данные индекса, то можете использовать следующие инструменты: ♦ системную процедуру sp_createstats; ♦ SQL Server Management Studio. Системная процедура spcreatestats создает статистические данные по одиночному столбцу для всех столбцов всех пользовательских таблиц текущей базы данных.…
Оценить
(0 голоса)
Как вы уже знаете из предыдущих разделов, Database Engine создает статистические данные для каждого существующего индекса. Система также может создавать статистические данные и для неиндексированных столбцов. Эти статистические данные называются статистическими данными столбца. Вместе со статистическими данными индекса статистические данные столбца используются для оптимизации плана выполнения запроса. Database Engine создает статистические данные даже для неиндексированного столбца, который является частью условия в предложении where. Существует несколько ситуаций, при которых наличие статистических данных столбца может помочь оптимизатору принять правильное решение. Одной из них является ситуация, когда у вас есть составной индекс из двух или более столбцов. Как вы уже знаете, для такого…
Оценить
(0 голоса)
Обычно порядок, в котором две или более соединяемые таблицы записываются в предложении from оператора select, не оказывает влияния на решение, принимаемое оптимизатором относительно порядка их обработки. Как вы увидите в следующем разделе, множество различных факторов влияет на решение оптимизатора, касающееся того, к какой таблице в первую очередь будет выполняться обращение. С другой стороны, вы можете повлиять на выбор порядка соединения, используя подсказку force order.
Оценить
(0 голоса)
Операция соединения является операцией, больше всего забирающей время при обработке запроса. Database Engine поддерживает следующие три различные техники обработки соединения, так что оптимизатор может выбрать одну из них в зависимости от статистических данных в каждой из таблиц: ♦ вложенные циклы; ♦ слияние соединения; ♦ хеширование соединения.
Оценить
(0 голоса)
Использование вложенных циклов является техникой обработки, которая работает как «грубая сила». Другими словами, для каждой строки внешней таблицы отыскивается и сравнивается каждая строка из внутренней таблицы. Псевдокод в примере 20.1 демонстрирует технику выполнения вложенных циклов для двух таблиц.   Здесь для каждой строки, выбранной из внешней таблицы (таблица а), осуществляется доступ ко всем строкам внутренней таблицы (таблица в). После этого выполняется сравнение значений, и строка добавляется в результирующий набор, если значения в обоих столбцах равны. Метод вложенных циклов является очень медленным, если не существует индекса для одного из соединяемых столбцов. При отсутствии индекса Database Engine должен выполнять сканирование внешней таблицы…
«ПерваяПредыдущая1234СледующаяПоследняя»
Навигация
© 2018 www.serversql.ru. Все права защищены.