Здравствуйте, 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