SQL函式惹得禍(SQL SERVER資料庫)

edwardking888發表於2011-08-23
今天早上系統維護後,發現一個庫的CPU奇怪(正常情況下CPU早10到20之間),現在已經在70到90之間了(當然問題,早就出現了,並不是今天早上的偶然事件,因為這個庫沒有安裝監控,所以............)。
檢查阻塞情況,排在前2名的是:
1.CXPACKET 
2.SOS_SCHEDULER_YIELD

CXPACKET 出現非常高,90%情況是由於並行查詢引起的(如果再結合PAGEIOLATCH_XX waits等待事件,可以推斷是有可能是進行大表並行查詢,使用了不正確的non-clustered或過時的statistics 引起的,導致錯誤的查詢計劃),但是這裡沒有出現PAGEIOLATCH_XX 。我在這裡保守的調整了MAXDOP 引數

EXEC sys.sp_configure N'show advanced options', N'1'  RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max degree of parallelism', N'1'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0'  RECONFIGURE WITH OVERRIDE
GO
這時CPU並沒有明顯降低,然後通過以下語句拉出高消耗CPU的SQL語句:
select 
    highest_cpu_queries.*,q.dbid, 
    q.objectid, q.number, q.encrypted, q.[text]
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(plan_handle) as q
order by highest_cpu_queries.total_worker_time desc
go

一檢視,發現是開發人員寫的SQL有問題。
這是一個很頻繁呼叫的list儲存過程,這個儲存過程的SQL裡面大量使用了系統函式(當然那個表的資料也有點多),導致CPU消耗很高,SQL部分語句如下:
WHERE ISNOTICED = 0 AND (ISNULL(notices, 0) < 6) 
 AND(@date BETWEEN DATEADD(s, 6, createtime) AND DATEADD(mi, 15, createtime)) 
 ORDER BY CREATETIME desc

當然還有很多,我就不摘錄了。和開發人員一起修改了SQL,問題得到解決。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-705609/,如需轉載,請註明出處,否則將追究法律責任。

相關文章