SQL Server – мощная система управления базами данных, которая может помочь нам оптимизировать производительность. В этой статье блога мы рассмотрим концепцию предупреждений Showplan и то, как они могут помочь нам диагностировать и улучшить производительность запросов.
Предыдущие предупреждения Showplan
В версиях до SQL Server 2012 уже было несколько предупреждений в плане выполнения, которые могли помочь нам выявить проблемы с медленными запросами. Эти предупреждения были разделены на предупреждения на уровне запроса и предупреждения на уровне оператора.
Предупреждения на уровне запроса включали общие проблемы, такие как отсутствие индексов, которые отображались в Management Studio после выполнения запроса. Предупреждения на уровне оператора возникали на уровне оператора и были обозначены желтым восклицательным знаком на значке оператора.
Примеры предупреждений на уровне оператора в предыдущих версиях SQL Server были “Отсутствуют предикаты объединения” и “Отсутствуют статистические данные по столбцу”. Эти предупреждения предоставляли ценную информацию о потенциальных узких местах производительности.
Новые предупреждения Showplan в SQL Server 2012
В SQL Server 2012 были введены новые предупреждения Showplan, которые дополнительно улучшают устранение неполадок и настройку запросов. Эти предупреждения специально решают проблемы с хэш-соединениями и переполнением сортировки в tempdb, вызванные низкими значениями памяти.
С новыми предупреждениями Showplan больше не нужно захватывать события трассировки для выявления предупреждений сортировки или хэша. Сам план выполнения теперь будет отображать эти предупреждения, что упрощает выявление и устранение проблем с производительностью.
Пример: предупреждение о переполнении сортировки
Давайте рассмотрим пример, чтобы понять, как работают новые предупреждения Showplan. Рассмотрим следующий скрипт:
USE tempdb GO -- Подготовка данных CREATE TABLE Plan_Warning (id INT PRIMARY KEY CLUSTERED, name VARCHAR(25), website CHAR(50)) GO SET NOCOUNT ON GO -- Заполнение фиктивными данными BEGIN TRAN DECLARE @counter INT SET @counter = 1 WHILE @counter <= 100000 BEGIN INSERT INTO Plan_Warning(id, name, website) VALUES (@counter, 'Vinod Kumar' + CONVERT(VARCHAR(10), @counter), 'blogs.ExtremeExperts.com') SET @counter = @counter + 1 END COMMIT TRAN PRINT 'Загрузка завершена ...' GO
Теперь выполним следующий запрос:
SET STATISTICS XML ON GO SELECT * FROM Plan_Warning WHERE id >= 7000 ORDER BY name DESC OPTION (MAXDOP 1) GO SET STATISTICS XML OFF GO
План выполнения для этого запроса будет отображать символ предупреждения с оператором сортировки. В разделе предупреждений будет указано, что произошло переполнение в tempdb. Это происходит, когда запрос извлекает больше строк, чем может поместиться в доступной памяти.
Аналогичные предупреждения могут возникать и для хэш-соединений, где предупреждение будет отображаться на узле хэш-соединения в плане выполнения.
Заключение
Предупреждения Showplan в SQL Server предоставляют ценную информацию о потенциальных проблемах производительности. При обнаружении этих предупреждений важно проанализировать запрос и рассмотреть возможность его оптимизации путем добавления дополнительных условий WHERE или мониторинга роста и конфликтов TempDB.
Путем постоянного изучения и изучения этих мелких деталей в каждом выпуске SQL Server мы можем улучшить производительность наших запросов к базе данных и обеспечить эффективное извлечение данных.