22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT TOP 30 OBJECT_NAME(qt.objectid,qt.dbId) AS procName
,DB_NAME(qt.dbId) AS [db_name]
,qt.text AS SQL_Full
,SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) AS SQL_Part --统计对应的部分语句
,qs.creation_time
,qs.last_execution_time
,qs.execution_count
,qs.last_elapsed_time/1000000 AS lastElapsedSeconds
,qs.last_worker_time/1000000 AS lastCpuSeconds
,CAST(qs.total_elapsed_time / 1000000.0 / (CASE when qs.execution_count=0 then -1 else qs.execution_count END) AS DECIMAL(28, 2)) AS avgDurationSeconds
,CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS lastLogicReadsMB
,qs.last_logical_reads
,sys.fn_varbintohexstr(qs.sql_handle)
,sys.fn_varbintohexstr(qs.plan_handle)
--,CONVERT(NVARCHAR(MAX), p.query_plan)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
--CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_elapsed_time >= 1000 * 1000
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY qs.last_worker_time DESC
然后将其中的查询类脚本(insert,update,delete去掉)写成一个存储过程, 在SQL Server加载时执行这个存储过程就好。
http://www.jb51.net/article/16049_all.htm
不过最好的办法, 建议还是用我上面的那个脚本, 找出慢SQL之后进行优化。
慢很多时候是因为缺少索引, 或者语句没有优化。