Выполнив трассировку профилировщика, вы увидите, есть ли у вас какие-либо узкие места на SQL Server.Ваша трассировка профилировщика по умолчанию (включая TextData for RPC: Completed) должна быть достаточной для начала.
Трассировку профилировщика можно проанализировать, чтобы увидеть, что занимает больше всего времени.Вы можете легко загрузить трассировку в таблицу и проанализировать ее там.Обратите внимание, что при загрузке в таблицу столбец длительности указывается в микросекундах.См. Функцию fn_trace_gettable для более быстрого способа загрузки файла трассировки в таблицу.
Распространенной причиной низкой производительности, особенно после серьезных изменений, является плохая индексация.Начиная с SQL Server 2005 оптимизатор хранит в структурах в памяти те индексы, которые он хотел бы видеть.Доступ к ним можно получить с помощью динамических административных представлений sys.dm_db_missing_index_details, sys.dm_db_missing_index_groups и sys.dm_db_missing_index_groups_stats.
Вот простой пример SQL для создания отсутствующего индекса, который генерирует отсутствующий индексный отчет, включая базовый код индекса, в том числе базовый код.
select
d.statement
, d.equality_columns
, d.inequality_columns
, d.included_columns
, s.user_seeks Seeks
, s.last_user_seek
, cast (s.avg_total_user_cost as decimal (9,2)) Cost
, s.avg_user_impact [%]
, 'CREATE INDEX MissingIndex_ ON ' + d.statement + '('
+ case when equality_columns IS NOT NULL then equality_columns else '' end
+ case when equality_columns IS NOT NULL AND inequality_columns IS NOT NULL then ', ' else '' end
+ case when inequality_columns IS NOT NULL then inequality_columns else '' end
+ ')'
+ case when included_columns IS NOT NULL then ' INCLUDE (' + included_columns + ')' else '' end
AS SQL
from sys.dm_db_missing_index_details d
INNER JOIN sys.dm_db_missing_index_groups g ON d.index_handle = g.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle