asp+iis之mssql2005长期占用cpu100%的sql排除解决法

网站基于IIS+asp,数据库mssql2005,CPU长期100%下不来,一般这种情况都是不合理使用SQL语句造成的,能使用索引的一定要建立索引。如果是因使用SQL随机语句order by newid()造成的100%,建议不要使用该函数,会造成全表扫描,数据量一多,查询增多的情况下必定CPU扛不住,这不是AWE或增加内存就能解决的,还是得从根本上优化SQL语句比较好。

1.png


先查看占用CPU高的语句来看自己的SQL:

SELECT TOP 10 TEXT AS 'SQL Statement'
    ,last_execution_time AS 'Last Execution Time'
    ,(total_logical_reads + total_physical_reads + total_logical_writes) / execution_count AS [Average IO]
    ,(total_worker_time / execution_count) / 1000000.0 AS [Average CPU Time (sec)]
    ,(total_elapsed_time / execution_count) / 1000000.0 AS [Average Elapsed Time (sec)]
    ,execution_count AS "Execution Count",qs.total_physical_reads,qs.total_logical_writes
    ,qp.query_plan AS "Query Plan"FROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) stCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qpORDER BY total_elapsed_time / execution_count DESC

针对第二条:

select top 80 id,ci from cihai order by newid()

优化改写成:

SELECT TOP 80 t1.id,t1.ci FROM cihai t1 JOIN (SELECT RAND()*100 AS nid) t2 ON t1.ID>t2.nid GROUP BY t1.ID,t1.ci

效果:

2.png

已经从前10里面消失的无影无踪。CPU占比使用率立刻下降3成。


我没有仔细去深究背后的机制,总之只看效果。网站基于IIS+asp,数据库mssql2005,CPU长期100%下不来,一般这种情况都是不合理使用SQL语句造成的,能使用索引的一定要建立索引。如果是因使用SQL随机语句order by newid()造成的100%,建议不要使用该函数,会造成全表扫描,数据量一多,查询增多的情况下必定CPU扛不住,这不是AWE或增加内存就能解决的,还是得从根本上优化SQL语句比较好。

1.png


先查看占用CPU高的语句来看自己的SQL:

SELECT TOP 10 TEXT AS 'SQL Statement'
    ,last_execution_time AS 'Last Execution Time'
    ,(total_logical_reads + total_physical_reads + total_logical_writes) / execution_count AS [Average IO]
    ,(total_worker_time / execution_count) / 1000000.0 AS [Average CPU Time (sec)]
    ,(total_elapsed_time / execution_count) / 1000000.0 AS [Average Elapsed Time (sec)]
    ,execution_count AS "Execution Count",qs.total_physical_reads,qs.total_logical_writes
    ,qp.query_plan AS "Query Plan"FROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) stCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qpORDER BY total_elapsed_time / execution_count DESC

针对第二条:

select top 80 id,ci from cihai order by newid()

优化改写成:

SELECT TOP 80 t1.id,t1.ci FROM cihai t1 JOIN (SELECT RAND()*100 AS nid) t2 ON t1.ID>t2.nid GROUP BY t1.ID,t1.ci

效果:

2.png

已经从前10里面消失的无影无踪。CPU占比使用率立刻下降3成。


我没有仔细去深究背后的机制,总之只看效果。

2020/8/22 13:25:00 技术杂谈