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查询的历史和他们分别花费的时间.这在历史分析非常有用.