Re: [SQL Server] Анализ всех запросов к таблице
От: Olaf Россия  
Дата: 06.07.15 07:42
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Здравствуйте.


S>Вероятно я спрашиваю что-то тривиальное, но можно ли профайлером получить все запросы в которых участвовала заданная таблица, а в идеале все индексы которые в них использовались при обращении к ней (ну и совсем хорошо статистику — число строк, логических чтений и т.п. для операции по этой таблице в запросе). Интересует именно сводная информация, т.к. само собой можно пройтись по всем запросам вручную, но это довольно долго и таблиц много.


У вас задача совсем нетривиальная, достаточно разнородная информация, которую нужно объединить как-то между собой. Сходу не могу сообразить, а как такое вообще можно получить.

Информацию по использованию индексов, включая кучу, с момента последней перезагрузки сервера можно получить так
select db_name(s.database_id) as database_name
       ,object_name(s.[object_id]) as table_name
       ,i.name as index_name
       ,i.index_id
       ,user_updates as total_writes
       ,user_seeks + user_scans + user_lookups as total_reads
       ,user_updates - (user_seeks + user_scans + user_lookups) as diff
from sys.dm_db_index_usage_stats as s
join sys.indexes as i on s.[object_id] = i.[object_id] and i.index_id = s.index_id

Информацию по использованию указанной таблицы в запросах можно получить из кэшированного плана запроса. Время жизни информации ограничено временем жизни плана в кэше.
;with xmlnamespaces (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select db_name(qp.dbid) as [database]
       ,object_name(qp.objectid, qp.dbid) as [object]
       ,qsa.last_execution_time
       ,qsa.avg_elapsed_time
       ,qsa.total_elapsed_time
       ,qp.query_plan
from
(
    select qs.plan_handle
           ,max(last_execution_time) as last_execution_time
           ,sum(total_elapsed_time / execution_count) as [avg_elapsed_time]
           ,sum(total_elapsed_time) as total_elapsed_time
    from sys.dm_exec_query_stats as qs
    group by qs.plan_handle 
) qsa 
cross apply sys.dm_exec_query_plan(qsa.plan_handle) as qp
where qp.query_plan.exist('//ColumnReference[@Table="[Photo]"]') = 1
order by qsa.total_elapsed_time desc
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.