现在的位置: 首页 > 综合 > 正文

SQL SERVER查询优化工具:统计SQL语句执行时间

2012年07月31日 ⁄ 综合 ⁄ 共 1972字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.