lihu129c 发表于 2018-10-24 07:14:50

根据SQL执行时长来优化

  1) 先清除缓存计划,注意生产环境谨慎使用此语句!
  dbcc freeProcCache
  2) 再执行查询,系统使用等等
  3) 查找执行最长的语句时间,可能需要执行多次来判断平均时间,代码如下:
  SELECTcreation_timeN'语句编译时间'
  ,last_execution_timeN'上次执行时间'
  ,total_physical_reads N'物理读取总次数'
  ,total_logical_reads/execution_count N'每次逻辑读次数'
  ,total_logical_readsN'逻辑读取总次数'
  ,total_logical_writes N'逻辑写入总次数'
  , execution_countN'执行次数'
  , total_worker_time/1000 N'所用的CPU总时间ms'
  , total_elapsed_time/1000N'总花费时间ms'
  , (total_elapsed_time / execution_count)/1000N'平均时间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
  where 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) not like '%fetch%'
  ORDER BYtotal_elapsed_time / execution_count DESC;
  4) 根据第 3 步 结果,复制最长时间的语句,然后执行,同时调出执行计划(CTRL+M)
  根据执行计划里占用最长的百分比,查看属性,输出列表
  5) 根据输出表的列去优化,例如建立索引

页: [1]
查看完整版本: 根据SQL执行时长来优化