SQL SERVER查询优化工具:统计SQL语句执行时间
1.使用SET STATISTICS TIME ON
-- 首先清除缓存
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;
-- 运行
SET STATISTICS TIME ON;
SELECT orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20060101'
AND orderdate < '20060201';
SET STATISTICS TIME OFF;
GO
您将会得到类似的消息:
SQL Server 分析和编译时间:
CPU 时间 = 15 毫秒,占用时间 = 33 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 6 毫秒。
输出显示了分析和编译该查询所花费的纯CPU时间和实耗时间,以及执行查询所花费的时间.
问题是:SET STATISTICS TIME ON;SET STATISTICS TIME OFF之间有多少条SQL语句,就输出多少次.阅读比较费尽.
2.使用getdate()
declare @d datetime
set @d=getdate()
--------------------------------------------------------
--/**
declare @year int
set @year = 2000
while @year<2065
begin
exec sp_reset @year,1
set @year = @year+1
end
--------------------------------------------------------
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--*/
在执行查询前在变量中存储GETDATE的值,查询后提取变量中存储的值.两个日期的差值就是本次批处理运行的时间.
3.使用 SQL SERVER Profiler
SQL SERVER Profiler可以监测数据库正在运行的SQL查询.如果要得到查询运行,请监测SP:StmtCompleted和SQL:BatchCompleted事件.Duration列代表执行的时间.
优点:是实时监测.
4.使用sys.dm_exec_query_stats和sys.dm_exec_sql_text.
sys.dm_exec_query_stats :返回缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。在从缓存删除计划时,也将从该视图中删除对应行。
sys.dm_exec_sql_text :返回由指定的 sql_handle 标识的 SQL 批处理的文本。该表值函数将替换系统函数 fn_get_sql。
SELECT total_worker_time/1000 N'所用的CPU总时间ms'
, total_elapsed_time/1000 N'总花费时间ms'
, (total_elapsed_time / execution_count)/1000 N'平均时间ms'
,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) N'执行语句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
优点:可以得到sql查询的历史和他们分别花费的时间.这在历史分析非常有用.
-----------------------------------------------------------------