我使用(和更新)的报告需要很长时间(有些需要数小时)。我觉得这太久了,以前就此问过。在深入研究讨论SQL性能的各种网站之后,他们都采取了DBA的立场。但是我不是,也不是我的同事(我想如果我们有DBA那么我们就不会有这个问题了。)
我想要的是一种简单的方法来返回前10个左右的大多数运行和最差的脚本。我希望有一个很好的SET METRICS ON开关,但我想如果是这样的话那么这些网站将不会继续关于录制配置文件。
我要做的最后一件事就是让性能进一步降低,录制个人资料听起来就像是性能杀手。
答案 0 :(得分:1)
您至少有以下选项。
最后,自动化工具将为您提供很长的路要走。在您的情况下甚至可能已足够,但请记住,没有自动化工具能够胜过熟练的DBA,因为自动化工具无法重写您的查询。
SET CONCAT_NULL_YIELDS_NULL OFF
--Joining the views gives a nice picture of what indexes
--would help and how much they would help
SELECT
'CREATE INDEX IX_' + UPPER(REPLACE(REPLACE(COALESCE(equality_columns, inequality_columns), '[', ''), ']', ''))
+ ' ON ' + d.statement + '(' + COALESCE(equality_columns, inequality_columns)
+ CASE WHEN equality_columns IS NOT NULL THEN
CASE WHEN inequality_columns IS NOT NULL THEN ', ' + inequality_columns
END END
+ ')' + CASE WHEN included_columns IS NOT NULL THEN ' INCLUDE (' + included_columns + ')' END
, object_name(object_id)
, d.*
, s.*
FROM sys.dm_db_missing_index_details d
LEFT OUTER JOIN sys.dm_db_missing_index_groups g ON d.index_handle = g.index_handle
LEFT OUTER JOIN sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle
WHERE database_id = db_id()
ORDER BY avg_total_user_cost DESC
答案 1 :(得分:1)
您应该能够通过sys.dm_exec_query_stats表,该表保存有关数据库的所有查询的信息。
SELECT creation_time
,last_execution_time
,total_physical_reads
,total_logical_reads
,total_logical_writes
, execution_count
, total_worker_time
, total_elapsed_time
, total_elapsed_time / execution_count avg_elapsed_time
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY last_execution_time,total_elapsed_time / execution_count DESC;
为您提供有关历史记录查询花费时间的基本时间信息。