Оптимизация запросов в Microsoft SQL Server Дмитрий Костылев Начальник отдела разработки системного ПО ОАО «Нордеа Банк» SQL Server MVP
Содержание Основные понятия Инструменты, поиск «плохих запросов» Анализ плана выполнения Причины снижения производительности Способы оптимизации запросов Техника написания "быстрых" запросов Табличные переменные и временные таблицы
Основные понятия Оптимизатор План выполнения
Пример плана выполнения select * from Client c cross apply ( select COUNT_BIG(*) as Cnt from Orders o where o.ClientID = c.ID and o.Status = 'A' ) cn where Status = 'D'
Основные понятия Оптимизатор План выполнения «Процедурный кэш» Статистика Рекомпиляция Логические чтения
Логические чтения IDName 1Иванов 2Петров 3Сидоров Клиенты Заказы IDClientID
Основные понятия Оптимизатор План выполнения «Процедурный кэш» Статистика Рекомпиляция Логические чтения Прослушивание параметров
Инструменты SQL Server Management Studio (SSMS) Profiler Динамические системные представления (DMV)
План выполнения запроса Читаем слева направо и сверху вниз Поток данных – справа налево и снизу вверх
Причины снижения производительности Изменились данные Устарела статистика Недостаточно ресурсов для поиска лучшего плана выполнения Процедура запущена с «плохими» параметрами
Способы оптимизации Изменение структур (создание и изменение индексов и статистик) Подсказки оптимизатору (hints): Уровня запроса Табличные Типы соединений Plan Guides Изменение логики запроса, использование промежуточных наборов Удаление хинтов
Техника написания быстрых запросов Все возможные вычисления делать предварительно Не изменять проиндексированные поля, если по ним желателен поиск Скажи нет неявным преобразованиям! Использовать INNER JOIN если только не нужен OUTER Порядок таблиц в запросе – сначала «меньшие потоки данных» Универсальные запросы работают всегда одинаково плохо Борьба с прослушивание параметров
Табличные переменные и временные таблицы Разное использование статистики Для временных таблиц сохраняются все правила «обычных» По табличным переменным не строится статистика, следствия: Нет перекомпиляции запросов после изменения данных в таблице Предполагается, что будет выбираться одна строка за одно обращение к таблице Можно использовать подсказку recompile
Итоги Быстродействие конкретных запросов зависит от выбранного оптимизатором плана выполнения Главным образом на выбор «правильного» плана выполнения влияет статистика Хорошая оптимизация запроса заключается в том, чтобы оптимизацией занимался сам сервер
Обратная связь Ваше мнение очень важно для нас. Пожалуйста, оцените доклад, заполните анкету и сдайте ее при выходе из зала Спасибо!
Вопросы DB804 Дмитрий Костылев начальник отдела разработки системного ПО Вы сможете задать вопросы докладчику в зоне «Спроси эксперта» в течение часа после завершения этого доклада