葡京网投哪个正规 > 新葡亰-数据 > 性能分析报表,性能调优【葡京网投哪个正规】

原标题:性能分析报表,性能调优【葡京网投哪个正规】

浏览次数:58 时间:2019-11-01

 一.概念

   SOS_SCHEDULER_YIELD等待类型是贰个职责自愿甩掉当前的财富占用,让给其余职分使用。   那些等待类型与CPU有从来关乎,与内部存款和储蓄器与也会有间接关联,与CPU有关联是因为在sql server里是通过任务调节SCHEDULELX570来波及CPU。 通过SCHEDULE中华V下的Worker线程来管理SQL职责。为何跟内享有关系吧,是因为获取的能源必要内部存储器来承载。 
  Yelding的爆发:是指SCHEDULEENCORE上运转的Worker都以非抢占式的, 在 SCHEDULEEnclave上Worker由于财富等待,让出当前Worker给其余Worker就叫Yielding。 关于SCHEDULELacrosse_YIELD发生的规律查看  sqlserver 职务调解与CPU。SOS_SCHEDULER_YIELD 等待的状态可以了解到:

  (1)CPU有压力

  (2) SQL Server CPU scheduler 使用合适管理就能够效用高。

1.1 从实例等级来查阅等待数

select wait_type,
waiting_tasks_count,
wait_time_ms ,
max_wait_time_ms,
signal_wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'SOS_SCHEDULER_YIELD%' 
order by wait_type

  查询如下图所示: 

葡京网投哪个正规 1

  这几个等待类型排行第二,从呼吁的次数来讲有693670伍拾柒遍,也正是说该线程用完了4ms的岁月片,主动扬弃cpu。比方未有大气的runnable队列或许大量的signal wait,注解不肯定是cpu难点。因为这五个指标是cpu压力的三个显示。必要检查实行陈设中是或不是存在大批量围观操作。

1.2 通过dmv scheaduler的描述查看cpu压力

SELECT scheduler_id, current_tasks_count, runnable_tasks_count, work_queue_count, pending_disk_io_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255

  如下图所示:

葡京网投哪个正规 2

  倘使您放在心上到runnable_tasks_count计数有两位数,持续非常长日子(风姿洒脱段时间内),你就能精通CPU压力。两位数字平日被感觉是生机勃勃件坏事 不可能应对近期负荷。其它能够由此质量监视器%Processor Time 来查看CPU的现象。

1.3 通过案例实时查看sql语句级的财富等待

SELECT * FROM sys.dm_exec_requests  WHERE wait_type LIKE 'SOS_SCHEDULER_YIELD%'

  -- 或研究财富等待的
  SELECT session_id ,status ,blocking_session_id
  ,wait_type ,wait_time ,wait_resource
  ,transaction_id
  FROM sys.dm_exec_requests
  WHERE status = N'suspended';

  如下图所示 运转sys.dm_exec_requests 表,由于字段多截取了三断。会话202的sql 语句上二遍等待类型是SOS_SCHEDULER_YIELD。之所以会现出YIELD,是因为SCHEDULEEscort下的Worker已经发起了task 命令,但由于财富等待 如锁大概磁盘输入/输出等,Worker又是非抢占式,所以让出了现阶段的Worker。

葡京网投哪个正规 3

葡京网投哪个正规 4

葡京网投哪个正规 5

1.4 减少sos_scheduler_yield 等待

  正如上面所商议的,这种等待类型与CPU压力有关。扩充更加的多CPU是不难的消除方案,可是达成那一个施工方案并不便于。当那个等待类型异常高时,你能够思考任何的工作。这里经过从缓存中找到与CPU相关的最值钱的SQL语句。

--查询编写翻译以来 cpu耗费时间总数最多的前50条(Total_woker_time) 第风度翩翩种查询
select
'total_worker_time(ms)'=(total_worker_time/1000),
q.[text], --DB_NAME(dbid),OBJECT_NAME(objectid),
execution_count,
'max_worker_time(ms)'=(max_worker_time/1000),
'last_worker_time(ms)'=(last_worker_time/1000),
'min_worker_time(ms)'=(min_worker_time/1000),
'max_elapsed_time(ms)'=(max_elapsed_time/1000),
'min_elapsed_time(ms)'=(min_elapsed_time/1000),
'last_elapsed_time(ms)'=(last_elapsed_time/1000),
total_physical_reads,
last_physical_reads,
min_physical_reads,
max_physical_reads,
total_logical_reads,
last_logical_reads,
max_logical_reads,
creation_time,
last_execution_time
from
(select top 50 qs.* from sys.dm_exec_query_stats qs order by qs.total_worker_time desc)
as highest_cpu_queries cross apply sys.dm_exec_sql_text(highest_cpu_queries.plan_handle) as q
order by highest_cpu_queries.total_worker_time DESC

 

试应用情况:SQL二零零六 LAND2、SQL2011、SQL二〇一六

[sql] view plaincopy

  1. --语句1:获取前20逻辑读取次数或逻辑写入次数或CPU 时间  
  2. SELECT TOP 20 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,  
  3. ((CASE qs.statement_end_offset  
  4. WHEN -1 THEN DATALENGTH(qt.TEXT)  
  5. ELSE qs.statement_end_offset  
  6. END - qs.statement_start_offset)/2)+1),  
  7. qs.execution_count,  
  8. qs.total_logical_reads, qs.last_logical_reads,  
  9. qs.total_logical_writes, qs.last_logical_writes,  
  10. qs.total_worker_time,  
  11. qs.last_worker_time,  
  12. qs.total_elapsed_time/1000000 total_elapsed_time_in_S,  
  13. qs.last_elapsed_time/1000000 last_elapsed_time_in_S,  
  14. qs.last_execution_time,  
  15. qp.query_plan  
  16. FROM sys.dm_exec_query_stats qs  
  17. CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt  
  18. CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp  
  19. ORDER BY qs.total_logical_reads DESC -- 逻辑读取次数  
  20.  --ORDER BY qs.total_logical_writes DESC -- 逻辑写入次数  
  21.  --ORDER BY qs.total_worker_time DESC -- CPU 时间  
  22.   
  23.   
  24. --语句2:获取前20实行的 SP 命令的总工程师时 (CPU 压力)  
  25.     SELECT TOP 20 qt.text AS 'SP Name', qs.total_worker_time AS 'TotalWorkerTime',   
  26.     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
  27.     qs.execution_count AS 'Execution Count',   
  28.     ISNULL(qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()), 0) AS 'Calls/Second',  
  29.     ISNULL(qs.total_elapsed_time/qs.execution_count, 0) AS 'AvgElapsedTime',   
  30.     qs.max_logical_reads, qs.max_logical_writes,   
  31.     DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'  
  32.     FROM sys.dm_exec_query_stats AS qs  
  33.     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  34.     WHERE qt.dbid = db_id() -- 当前数据库  
  35.     ORDER BY qs.total_worker_time DESC  
  36.   
  37. --语句3: 获取前20 试行的 SP 命令逻辑写入/分钟  
  38.     SELECT TOP 20 qt.text AS 'SP Name', qs.total_logical_writes, qs.total_logical_writes/qs.execution_count AS 'AvgLogicalWrites',  
  39.     qs.total_logical_writes/DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Logical Writes/Min',    
  40.     qs.execution_count AS 'Execution Count',   
  41.     qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',   
  42.     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
  43.     qs.total_worker_time AS 'TotalWorkerTime',  
  44.     qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
  45.     qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
  46.     DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache',  
  47.     qs.total_physical_reads/qs.execution_count AS 'Avg Physical Reads', qt.dbid  
  48.     FROM sys.dm_exec_query_stats AS qs  
  49.     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  50.     WHERE qt.dbid = db_id() -- 当前数据库  
  51.     ORDER BY qs.total_logical_writes DESC  
  52.   
  53. --语句4: 获取前20施行的 SP 命令的逻辑读取(内部存款和储蓄器压力)   
  54.     SELECT TOP 20 qt.text AS 'SP Name', total_logical_reads,   
  55.     qs.execution_count AS 'Execution Count', total_logical_reads/qs.execution_count AS 'AvgLogicalReads',  
  56.     qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',   
  57.     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
  58.     qs.total_worker_time AS 'TotalWorkerTime',  
  59.     qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
  60.     qs.total_logical_writes,  
  61.     qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
  62.     DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache', qt.dbid   
  63.     FROM sys.dm_exec_query_stats AS qs  
  64.     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  65.     WHERE qt.dbid = db_id() -- 当前数据库  
  66.     ORDER BY total_logical_reads DESC  
  67.   
  68. --语句5: 获取前20执行的 SP 命令由物理读取 (读取 I/O 压力)  
  69.     SELECT TOP 20 qt.text AS 'SP Name', qs.total_physical_reads, qs.total_physical_reads/qs.execution_count AS 'Avg Physical Reads',  
  70.     qs.execution_count AS 'Execution Count',  
  71.     qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',    
  72.     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
  73.     qs.total_worker_time AS 'TotalWorkerTime',  
  74.     qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
  75.     qs.max_logical_reads, qs.max_logical_writes,    
  76.     DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache', qt.dbid   
  77.     FROM sys.dm_exec_query_stats AS qs  
  78.     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  79.     WHERE qt.dbid = db_id() -- 当前数据库  
  80.     ORDER BY qs.total_physical_reads DESC  
  81.   
  82. --语句6: 获取前20实行的 SP 命令施行计数  
  83.     SELECT TOP 20 qt.text AS 'SP Name', qs.execution_count AS 'Execution Count',    
  84.     qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',  
  85.     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
  86.     qs.total_worker_time AS 'TotalWorkerTime',  
  87.     qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
  88.     qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
  89.     DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'  
  90.     FROM sys.dm_exec_query_stats AS qs  
  91.     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  92.     WHERE qt.dbid = db_id() -- Filter by current database  
  93.     ORDER BY qs.execution_count DESC  

 

查阅10秒时间内积存进度实施次数和CPU时间

[sql] view plaincopy葡京网投哪个正规 6葡京网投哪个正规 7

  1. SELECT DB_NAME(st.dbid) DBName  
  2.       ,OBJECT_SCHEMA_NAME(st.objectid,dbid) SchemaName  
  3.       ,OBJECT_NAME(st.objectid,dbid) StoredProcedure  
  4.       ,max(cp.usecounts) Execution_count  
  5.       ,sum(qs.total_worker_time) total_cpu_time  
  6.       ,sum(qs.total_worker_time) / (max(cp.usecounts) * 1.0)  avg_cpu_time  
  7.  into #temp  
  8.  FROM sys.dm_exec_cached_plans cp join sys.dm_exec_query_stats qs on cp.plan_handle = qs.plan_handle  
  9.       CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st  
  10.  where DB_NAME(st.dbid) is not null and cp.objtype = 'proc'  
  11.  group by DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid), OBJECT_NAME(objectid,st.dbid)   
  12.  order by sum(qs.total_worker_time) desc  
  13.   
  14. WAITFOR DELAY '00:00:10'   
  15.   
  16. SELECT DB_NAME(st.dbid) DBName  
  17.       ,OBJECT_SCHEMA_NAME(st.objectid,dbid) SchemaName  
  18.       ,OBJECT_NAME(st.objectid,dbid) StoredProcedure  
  19.       ,max(cp.usecounts) Execution_count  
  20.       ,sum(qs.total_worker_time) total_cpu_time  
  21.       ,sum(qs.total_worker_time) / (max(cp.usecounts) * 1.0)  avg_cpu_time  
  22.  into #temp2  
  23.  FROM sys.dm_exec_cached_plans cp join sys.dm_exec_query_stats qs on cp.plan_handle = qs.plan_handle  
  24.       CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st  
  25.  where DB_NAME(st.dbid) is not null and cp.objtype = 'proc'  
  26.  group by DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid), OBJECT_NAME(objectid,st.dbid)   
  27.  order by sum(qs.total_worker_time) desc  
  28.   
  29. SELECT a.DBNAMe, a.SchemaName, a.StoredProcedure,  
  30. b.Execution_count - a.Execution_count as ExecCnt,  
  31. b.total_cpu_time - a.total_cpu_time as CPU   
  32. FROM #temp a inner join #temp2 b on a.DBName = b.DBname and a.SchemaName = b.SchemaName and a.StoredProcedure = b.StoredProcedure  
  33. ORDER BY 5 desc  
  34.   
  35. drop table #temp  
  36. drop table #temp2   
  • dm_db_*:数据库和数据库对象

  • dm_exec_*:施行顾客代码和关联的连天

  • dm_os_*:内部存款和储蓄器、锁定和时间安顿

  • dm_tran_*:事务和隔开

  • dm_io_*:互连网和磁盘的输入/输出

SELECT TOP 50 sum(qs.total_worker_time)/1000 AS total_cpu_time,
sum(qs.execution_count)/1000 AS total_execution_count,
count(*) AS number_of_statements,
qs.plan_handle,qs.sql_handle
FROM sys.dm_exec_query_stats qs
GROUP BY qs.plan_handle
ORDER BY sum(qs.total_worker_time) DESC

  

例行服务器动态管理对象包含:

 

试应用环境:SQL2008 R2、SQL2012、SQL2014

[sql] view plaincopy
--语句1:获取前20逻辑读取次数或逻辑写入次数或CPU 时间  
SELECT TOP 20 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,  
((CASE qs.statement_end_offset  
WHEN -1 THEN DATALENGTH(qt.TEXT)  
ELSE qs.statement_end_offset  
END - qs.statement_start_offset)/2)+1),  
qs.execution_count,  
qs.total_logical_reads, qs.last_logical_reads,  
qs.total_logical_writes, qs.last_logical_writes,  
qs.total_worker_time,  
qs.last_worker_time,  
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,  
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,  
qs.last_execution_time,  
qp.query_plan  
FROM sys.dm_exec_query_stats qs  
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt  
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp  
ORDER BY qs.total_logical_reads DESC -- 逻辑读取次数  
 --ORDER BY qs.total_logical_writes DESC -- 逻辑写入次数  
 --ORDER BY qs.total_worker_time DESC -- CPU 时间  


--语句2:获取前20执行的 SP 命令的总工作时间 (CPU 压力)  
    SELECT TOP 20 qt.text AS 'SP Name', qs.total_worker_time AS 'TotalWorkerTime',   
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
    qs.execution_count AS 'Execution Count',   
    ISNULL(qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()), 0) AS 'Calls/Second',  
    ISNULL(qs.total_elapsed_time/qs.execution_count, 0) AS 'AvgElapsedTime',   
    qs.max_logical_reads, qs.max_logical_writes,   
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'  
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
    WHERE qt.dbid = db_id() -- 当前数据库  
    ORDER BY qs.total_worker_time DESC  

--语句3: 获取前20 执行的 SP 命令逻辑写入/分钟  
    SELECT TOP 20 qt.text AS 'SP Name', qs.total_logical_writes, qs.total_logical_writes/qs.execution_count AS 'AvgLogicalWrites',  
    qs.total_logical_writes/DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Logical Writes/Min',    
    qs.execution_count AS 'Execution Count',   
    qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',   
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
    qs.total_worker_time AS 'TotalWorkerTime',  
    qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
    qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache',  
    qs.total_physical_reads/qs.execution_count AS 'Avg Physical Reads', qt.dbid  
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
    WHERE qt.dbid = db_id() -- 当前数据库  
    ORDER BY qs.total_logical_writes DESC  

--语句4: 获取前20执行的 SP 命令的逻辑读取(内存压力)   
    SELECT TOP 20 qt.text AS 'SP Name', total_logical_reads,   
    qs.execution_count AS 'Execution Count', total_logical_reads/qs.execution_count AS 'AvgLogicalReads',  
    qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',   
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
    qs.total_worker_time AS 'TotalWorkerTime',  
    qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
    qs.total_logical_writes,  
    qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache', qt.dbid   
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
    WHERE qt.dbid = db_id() -- 当前数据库  
    ORDER BY total_logical_reads DESC  

--语句5: 获取前20执行的 SP 命令由物理读取 (读取 I/O 压力)  
    SELECT TOP 20 qt.text AS 'SP Name', qs.total_physical_reads, qs.total_physical_reads/qs.execution_count AS 'Avg Physical Reads',  
    qs.execution_count AS 'Execution Count',  
    qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',    
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
    qs.total_worker_time AS 'TotalWorkerTime',  
    qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
    qs.max_logical_reads, qs.max_logical_writes,    
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache', qt.dbid   
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
    WHERE qt.dbid = db_id() -- 当前数据库  
    ORDER BY qs.total_physical_reads DESC  

--语句6: 获取前20执行的 SP 命令执行计数  
    SELECT TOP 20 qt.text AS 'SP Name', qs.execution_count AS 'Execution Count',    
    qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',  
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',  
    qs.total_worker_time AS 'TotalWorkerTime',  
    qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',  
    qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,   
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'  
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
    WHERE qt.dbid = db_id() -- Filter by current database  
    ORDER BY qs.execution_count DESC  

查看10秒时间内存储过程执行次数和CPU时间
[sql] view plaincopy在CODE上查看代码片派生到我的代码片
SELECT DB_NAME(st.dbid) DBName  
      ,OBJECT_SCHEMA_NAME(st.objectid,dbid) SchemaName  
      ,OBJECT_NAME(st.objectid,dbid) StoredProcedure  
      ,max(cp.usecounts) Execution_count  
      ,sum(qs.total_worker_time) total_cpu_time  
      ,sum(qs.total_worker_time) / (max(cp.usecounts) * 1.0)  avg_cpu_time  
 into #temp  
 FROM sys.dm_exec_cached_plans cp join sys.dm_exec_query_stats qs on cp.plan_handle = qs.plan_handle  
      CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st  
 where DB_NAME(st.dbid) is not null and cp.objtype = 'proc'  
 group by DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid), OBJECT_NAME(objectid,st.dbid)   
 order by sum(qs.total_worker_time) desc  

WAITFOR DELAY '00:00:10'   

SELECT DB_NAME(st.dbid) DBName  
      ,OBJECT_SCHEMA_NAME(st.objectid,dbid) SchemaName  
      ,OBJECT_NAME(st.objectid,dbid) StoredProcedure  
      ,max(cp.usecounts) Execution_count  
      ,sum(qs.total_worker_time) total_cpu_time  
      ,sum(qs.total_worker_time) / (max(cp.usecounts) * 1.0)  avg_cpu_time  
 into #temp2  
 FROM sys.dm_exec_cached_plans cp join sys.dm_exec_query_stats qs on cp.plan_handle = qs.plan_handle  
      CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st  
 where DB_NAME(st.dbid) is not null and cp.objtype = 'proc'  
 group by DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid), OBJECT_NAME(objectid,st.dbid)   
 order by sum(qs.total_worker_time) desc  

SELECT a.DBNAMe, a.SchemaName, a.StoredProcedure,  
b.Execution_count - a.Execution_count as ExecCnt,  
b.total_cpu_time - a.total_cpu_time as CPU   
FROM #temp a inner join #temp2 b on a.DBName = b.DBname and a.SchemaName = b.SchemaName and a.StoredProcedure = b.StoredProcedure  
ORDER BY 5 desc  

drop table #temp  
drop table #temp2   

监控 CPU 瓶颈

CPU 瓶颈日常由以下原因引起:查询陈设并不是最优、配置失当、设计成分不良或硬件财富缺乏。上面包车型大巴常用查询可扶持你分明导致 CPU 瓶颈的案由。

上边包车型客车询问使您能够一箭中的驾驭当下缓存的怎么批管理或进度占用了大多 CPU 能源。

  1. SELECT TOP 50   
  2.       SUM(qs.total_worker_time) AS total_cpu_time,   
  3.       SUM(qs.execution_count) AS total_execution_count,  
  4.       COUNT(*) AS  number_of_statements,   
  5.       qs.sql_handle   
  6. FROM sys.dm_exec_query_stats AS qs  
  7. GROUP BY qs.sql_handle  
  8. ORDER BY SUM(qs.total_worker_time) DESC  

 

上边包车型客车查询显示缓存陈设所占用的 CPU 总使用率(带 SQL 文本)。

 

  1. SELECT   
  2.       total_cpu_time,   
  3.       total_execution_count,  
  4.       number_of_statements,  
  5.       s2.text  
  6.       --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text  
  7. FROM   
  8.       (SELECT TOP 50   
  9.             SUM(qs.total_worker_time) AS total_cpu_time,   
  10.             SUM(qs.execution_count) AS total_execution_count,  
  11.             COUNT(*) AS  number_of_statements,   
  12.             qs.sql_handle --,  
  13.             --MIN(statement_start_offset) AS statement_start_offset,   
  14.             --MAX(statement_end_offset) AS statement_end_offset  
  15.       FROM   
  16.             sys.dm_exec_query_stats AS qs  
  17.       GROUP BY qs.sql_handle  
  18.       ORDER BY SUM(qs.total_worker_time) DESC) AS stats  
  19.       CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2  

上边包车型客车查询呈现 CPU 平均占用率最高的前 50 个 SQL 语句。

 

 

  1. SELECT TOP 50  
  2. total_worker_time/execution_count AS [Avg CPU Time],  
  3. (SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_葡京网投哪个正规,end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *  
  4. FROM sys.dm_exec_query_stats   
  5. ORDER BY [Avg CPU Time] DESC  

葡京正网网投,上边彰显用于搜索过多编写翻译/重新编写翻译的 DMV 查询。

 

 

  1. select * from sys.dm_exec_query_optimizer_info  
  2. where   
  3.       counter = 'optimizations'  
  4.       or counter = 'elapsed time'  

下边包车型客车示范查询显示已再度编写翻译的前 二十多个存款和储蓄进度。plan_generation_num 提醒该查询已重新编写翻译的次数。

 

 

  1. select top 25  
  2.       sql_text.text,  
  3.       sql_handle,  
  4.       plan_generation_num,  
  5.       execution_count,  
  6.       dbid,  
  7.       objectid   
  8. from sys.dm_exec_query_stats a  
  9.       cross apply sys.dm_exec_sql_text(sql_handle) as sql_text  
  10. where plan_generation_num > 1  
  11. order by plan_generation_num desc  

频率超级低的询存候顿大概增大 CPU 占用率。

 

上面包车型地铁查询彰显哪个查询占用了最多的 CPU 累积使用率。

 

  1. SELECT   
  2.     highest_cpu_queries.plan_handle,   
  3.     highest_cpu_queries.total_worker_time,  
  4.     q.dbid,  
  5.     q.objectid,  
  6.     q.number,  
  7.     q.encrypted,  
  8.     q.[text]  
  9. from   
  10.     (select top 50   
  11.         qs.plan_handle,   
  12.         qs.total_worker_time  
  13.     from   
  14.         sys.dm_exec_query_stats qs  
  15.     order by qs.total_worker_time desc) as highest_cpu_queries  
  16.     cross apply sys.dm_exec_sql_text(plan_handle) as q  
  17. order by highest_cpu_queries.total_worker_time desc  

上面包车型大巴询问呈现一些只怕占用大批量 CPU 使用率的运算符(举例 ‘%Hash Match%’、‘%Sort%’)以搜索思疑目的。

 

 

  1. select *  
  2. from   
  3.       sys.dm_exec_cached_plans  
  4.       cross apply sys.dm_exec_query_plan(plan_handle)  
  5. where   
  6.       cast(query_plan as nvarchar(max)) like '%Sort%'  
  7.       or cast(query_plan as nvarchar(max)) like '%Hash Match%'  

比方已检验到效用低下并导致 CPU 占用率较高的查询安插,请对该查询中提到的表运转 UPDATE STATISTICS 以查看该难题是或不是还是存在。然后,搜聚相关数据并将此主题素材报告给 PerformancePoint 规划帮助人口。

 

倘诺您的系统留存过多的编写翻译和重复编写翻译,也许会导致系统出现与 CPU 相关的品质难点。

你能够运转上边包车型大巴 DMV 查询来寻找过多的编写翻译/重新编写翻译。

 

  1. select * from sys.dm_exec_query_optimizer_info  
  2. where   
  3. counter = 'optimizations'  
  4. or counter = 'elapsed time'  

下边包车型客车亲自过问查询展现已重新编写翻译的前 22个存款和储蓄进度。plan_generation_num 提醒该查询已重新编写翻译的次数。

 

 

  1. select top 25  
  2. sql_text.text,  
  3. sql_handle,  
  4. plan_generation_num,  
  5. execution_count,  
  6. dbid,  
  7. objectid   
  8. from sys.dm_exec_query_stats a  
  9. cross apply sys.dm_exec_sql_text(sql_handle) as sql_text  
  10. where plan_generation_num > 1  
  11. order by plan_generation_num desc  

假定已检测到过多的编写翻译或重复编写翻译,请尽也许多地收集有关数据并将其告知给规划扶持人口。

 

--前n条语句的读写次数
select sum(qs1.total_logical_reads)
from sys.dm_exec_query_stats as qs1
cross apply sys.dm_exec_sql_text(qs1.sql_handle) as st1
where sql_handle in (
select top 100 qs.sql_handle
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as st
order by qs.total_logical_reads desc)

I/O 瓶颈

自己批评闩锁等待总计音讯以鲜明 I/O 瓶颈。运转上面包车型地铁 DMV 查询以搜寻 I/O 闩锁等待总计音信。

 

  1. select wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms, wait_time_ms / waiting_tasks_count  
  2. from sys.dm_os_wait_stats    
  3. where wait_type like 'PAGEIOLATCH%'  and waiting_tasks_count > 0  
  4. order by wait_type  

如果 waiting_task_counts 和 wait_time_ms 与常规情形相比有同理可得变化,则足以鲜明存在 I/O 难点。获取 SQL Server 平稳运作时质量流速計和主要性 DMV 查询输出的基线特别关键。

 

这些 wait_types 能够提示您的 I/O 子系统是不是蒙受瓶颈。

动用以下 DMV 查询来查究当前挂起的 I/O 央求。请准时实践此询问以检讨 I/O 子系统的运营处境,并切断 I/O 瓶颈中涉及的情理磁盘。

 

  1. select   
  2.     database_id,   
  3.     file_id,   
  4.     io_stall,  
  5.     io_pending_ms_ticks,  
  6.     scheduler_address   
  7. from  sys.dm_io_virtual_file_stats(NULL, NULL)t1,  
  8.         sys.dm_io_pending_io_requests as t2  
  9. where t1.file_handle = t2.io_handle  

在寻常情状下,该查询普通不回去任何内容。假设此询问重回一些行,则须要进一步查验。

 

你还是能奉行下边包车型地铁 DMV 查询以搜寻 I/O 相关询问。

 

  1. select top 5 (total_logical_reads/execution_count) as avg_logical_reads,  
  2.                    (total_logical_writes/execution_count) as avg_logical_writes,  
  3.            (total_physical_reads/execution_count) as avg_physical_reads,  
  4.            Execution_count, statement_start_offset, p.query_plan, q.text  
  5. from sys.dm_exec_query_stats  
  6.       cross apply sys.dm_exec_query_plan(plan_handle) p  
  7.       cross apply sys.dm_exec_sql_text(plan_handle) as q  
  8. order by (total_logical_reads + total_logical_writes)/execution_count Desc  

上边包车型地铁 DMV 查询可用于查找哪些批管理/诉求生成的 I/O 最多。如下所示的 DMV 查询可用以查找可生成最多 I/O 的前八个要求。调度这一个查询将增进系统脾性。

 

 

  1. select top 5   
  2.     (total_logical_reads/execution_count) as avg_logical_reads,  
  3.     (total_logical_writes/execution_count) as avg_logical_writes,  
  4.     (total_physical_reads/execution_count) as avg_phys_reads,  
  5.      Execution_count,   
  6.     statement_start_offset as stmt_start_offset,   
  7.     sql_handle,   
  8.     plan_handle  
  9. from sys.dm_exec_query_stats    
  10. order by  (total_logical_reads + total_logical_writes) Desc  

 

--上面包车型地铁演示重返使会话 ID 与某后生可畏 Windows 线程 ID 相关联的新闻。
--能够在 Windows 质量监视器中监视该线程的属性。该查询不回去当前正值休眠的对话 ID。

内部存款和储蓄器瓶颈

先深圳部存款和储蓄器压力检验和考查在此以前,请确认保证已启用 SQL Server 中的高端选项。请先对 master 数据库运营以下查询以启用此选项。

 

  1. sp_configure 'show advanced options'  
  2. go  
  3. sp_configure 'show advanced options', 1  
  4. go  
  5. reconfigure  
  6. go  

首先运转以下查询以检查内存相关配置选项。

 

 

  1. sp_configure 'awe_enabled'  
  2. go  
  3. sp_configure 'min server memory'  
  4. go  
  5. sp_configure 'max server memory'  
  6. go  
  7. sp_configure 'min memory per query'  
  8. go  
  9. sp_configure 'query wait'  
  10. go  

运维上面包车型地铁 DMV 查询以查看 CPU、陈设程序内部存款和储蓄器和缓冲池音信。

 

 

  1. select   
  2. cpu_count,  
  3. hyperthread_ratio,  
  4. scheduler_count,  
  5. physical_memory_in_bytes / 1024 / 1024 as physical_memory_mb,  
  6. virtual_memory_in_bytes / 1024 / 1024 as virtual_memory_mb,  
  7. bpool_committed * 8 / 1024 as bpool_committed_mb,  
  8. bpool_commit_target * 8 / 1024 as bpool_target_mb,  
  9. bpool_visible * 8 / 1024 as bpool_visible_mb  
  10. from sys.dm_os_sys_info  

 

--前50条逻辑读写最大的话语
select top 50
qs.creation_time,qs.last_execution_time,qs.execution_count,qs.total_worker_time,
qs.total_physical_reads,qs.max_physical_reads,qs.total_logical_reads,qs.max_logical_reads,qs.min_logical_reads,
st.text
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as st
--where st.text like '%dv_topic%'
order by qs.total_logical_reads desc
select count(*) from flux_page

Microsoft SQL Server 二〇〇七提供了有些工具来监督数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态处理函数 (DMF) 重回的服务器状态新闻可用以监察和控制服务器实例的运转情形、检查判断难点和优化质量。

 

示范查询

您能够运作以下查询来收获具备 DMV 和 DMF 名称:

  1. SELECT * FROM sys.system_objects  
  2. WHERE name LIKE 'dm_%'  
  3. ORDER BY name  

 

--什么人过不去了自己
SELECT blocked_query.session_id AS blocked_session_id,
blocking_query.session_id AS blocking_session_id,
sql_text.text AS blocking_text,
waits.wait_type AS blocking_resource
FROM sys.dm_exec_requests AS blocked_query
INNER JOIN
sys.dm_exec_requests AS blocking_query
ON blocked_query.blocking_session_id=blocking_query.session_id
CROSS APPLY
(SELECT * FROM sys.dm_exec_sql_text(blocking_query.sql_handle)) AS sql_text
INNER JOIN
sys.dm_os_waiting_tasks AS waits
ON waits.session_id=blocking_query.session_id

此部分介绍为监察 SQL Server 运营情况而针对这几个动态管理视图和函数运维的一些常用查询。

--总的逻辑读写次数
select sum(qs.total_logical_reads)
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as st

阻塞

运维下边包车型大巴查询可分明阻塞的对话。

 

  1. select blocking_session_id, wait_duration_ms, session_id from   
  2. sys.dm_os_waiting_tasks  
  3. where blocking_session_id is not null  

采纳此调用可寻觅 blocking_session_id 所重回的 SQL。举个例子,如若blocking_session_id 是 87,则运营此询问可获得对应的 SQL。

 

 

  1. dbcc INPUTBUFFER(87)  

上面包车型大巴查询展现 SQL 等待剖析和前 10 个等待的财富。

 

 

  1. select top 10 *  
  2. from sys.dm_os_wait_stats  
  3. --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')  
  4. order by wait_time_ms desc  

若要寻找哪些 spid 正在围堵另两个spid,可在数据库中创立以下存款和储蓄进程,然后试行该存款和储蓄进程。此存款和储蓄进程会报告此阻塞情状。键入sp_who 可找出@spid;@spid 是可选参数。

 

 

  1. create proc dbo.sp_block (@spid bigint=NULL)  
  2. as  
  3. select   
  4.     t1.resource_type,  
  5.     'database'=db_name(resource_database_id),  
  6.     'blk object' = t1.resource_associated_entity_id,  
  7.     t1.request_mode,  
  8.     t1.request_session_id,  
  9.     t2.blocking_session_id      
  10. from   
  11.     sys.dm_tran_locks as t1,   
  12.     sys.dm_os_waiting_tasks as t2  
  13. where   
  14.     t1.lock_owner_address = t2.resource_address and  
  15.     t1.request_session_id = isnull(@spid,t1.request_session_id)  

以下是利用此存款和储蓄进程的演示。

 

 

  1. exec sp_block  
  2. exec sp_block @spid = 7  

 

 

原地址:aspx" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(255, 153, 0); text-decoration: none; ">

--查询锁音讯
select * from sys.dm_tran_locks
--查询newbjx数据库中表的数量
select count(*) from newbjx..sysobjects where type='u' and status>=0
DECLARE
@USER_ID INT,
@KILLCMD VARCHAR(100),
@WAIT_TIME INT
-- 设置空闲时间
SET @WAIT_TIME = 2;
-- 依照选拔原则,接收出应该裁撤的经过
DECLARE cur_lock CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE
DATEDIFF(minute, last_batch, getdate()) > @WAIT_TIME
AND blocked = 0
AND spid IN
(SELECT blocked
FROM master..sysprocesses);
-- 撤除全数采用出的进程。
OPEN cur_lock;
FETCH NEXT FROM cur_lock INTO @USER_ID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @KILLCMD = 'kill ' + CAST(@USER_ID AS VARCHAR)
EXECUTE (@KILLCMD);
FETCH NEXT FROM cur_lock INTO @USER_ID;
END;
CLOSE cur_lock;
DEALLOCATE cur_lock;

 

 

set statistics io on
set statistics time on

ECLARE
@USER_ID INT,
@KILLCMD VARCHAR(100),
@WAIT_TIME INT
-- 设置空闲时间
SET @WAIT_TIME = 2;
-- 依照选用原则,接纳出应有撤消的进程
DECLARE cur_lock CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE
DATEDIFF(minute, last_batch, getdate()) > @WAIT_TIME
AND blocked = 0
AND spid IN
(SELECT blocked
FROM master..sysprocesses);
-- 撤废全体接受出的历程。
OPEN cur_lock;
FETCH NEXT FROM cur_lock INTO @USER_ID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @KILLCMD = 'kill ' + CAST(@USER_ID AS VARCHAR)
EXECUTE (@KILLCMD);
FETCH NEXT FROM cur_lock INTO @USER_ID;
END;
CLOSE cur_lock;
DEALLOCATE cur_lock;

--哪少年老成组TSQL或进程占用了最多的CPU时间:

--语句推行的总次数
select sum(qs.execution_count)
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as st

SELECT  creation_time  N'语句编写翻译时间'
        ,last_execution_time  N'上次推行时间'
        ,total_physical_reads N'物理读取总次数'
        ,total_logical_reads/execution_count N'每回逻辑读次数'
        ,total_logical_reads  N'逻辑读取总次数'
        ,total_logical_writes N'逻辑写入总次数'
        , execution_count  N'试行次数'
        , 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 dm_exec_query_stats AS qs
CROSS APPLY 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 BY  total_elapsed_time / execution_count DESC;

SELECT STasks.session_id, SThreads.os_thread_id
FROM sys.dm_os_tasks AS STasks
INNER JOIN sys.dm_os_threads AS SThreads
ON STasks.worker_address = SThreads.worker_address
WHERE STasks.session_id IS NOT NULL
ORDER BY STasks.session_id;
GO

--单次进行花费CPU时间最长的询请安顿
SELECT TOP 5 total_worker_time,last_worker_time,max_worker_time,min_worker_time,
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) AS statement_text
FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY max_worker_time DESC
--施行次数最多的询存候排
SELECT TOP 5 creation_time,last_execution_time,execution_count,
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) AS statement_text
FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY execution_count DESC

 

--共实行多少条语句
select count(*)
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle)

本文由葡京网投哪个正规发布于新葡亰-数据,转载请注明出处:性能分析报表,性能调优【葡京网投哪个正规】

关键词:

上一篇:jQuery判断iframe中元素是否存在的方法,校验字符串葡京网投哪个正规:

下一篇:单表查询,去年等的数据的方法