1. 程式人生 > >解決SQLServer CPU佔用100%的問題

解決SQLServer CPU佔用100%的問題

建索引的方法:ALTER INDEX ALL ON DOA REORGANIZE

sp_who active  --看看哪個引起的阻塞, blk
sp_lock  --看看鎖住了那個資源id, objid , select object_name(objid) 得到
dbcc inputbuffer(@blk) -- 看看是那個語句

----------------------------------------------------------------------------

優化SQLServer的配置.sql

%%
******************************************************************************************************/
go


exe(小寫c) sp_configure "awe enabled","1"--記憶體可以支援64g
exe(小寫c) sp_configure "lightweight pooling","0"--不使用nt纖程
exe(小寫c) sp_configure "priority boost","1"--增加sqlserver優先順序
exe(小寫c) sp_configure "network packet size (b)","8192"--增加sqlserver網路包的大小


reconfigure with override

go


--優化資料庫設定
declare @currentdatabase

 sysname
select @currentdatabase = db_name((select dbid from master.dbo.sysprocesses wherespid = @@spid))
exe(小寫c) sp_dboption @currentdatabase, 'select into/bulkcopy', 'true' --對大容量資料操作不記錄日誌
exe(小寫c) sp_dboption @currentdatabase, 'trunc. log on chkpt.', 'true' --自動截斷日誌
exe(小寫c) sp_dboption @currentdatabase
, 'auto create statistics', 'true'--自動建立統計
exe(小寫c) sp_dboption @currentdatabase, 'auto update statistics', 'true'--自動更新統

檢視SQL版本號:

看SP補丁打全了沒。

1、收縮資料庫( 日誌檔案)
2、重建索引
3、資料庫硬碟所在區域  db伺服器價效比比較好的方式是搭建raid5 追求效能的話是raid0 
使用perfmon觀察disk queue,看是否一直高於1,如果長時間高於1說明磁碟效能有問題,意味著磁碟操作需要排隊完成。考慮升級儲存裝置
加入“Page Life Expectancy”如果這個值始終小於300秒,意味著你需要更大的記憶體(在Sql Server: Buffer Manager裡)
加入“Buffer Cache hit ratio” 如果這個值小於90%,意味著你需要更大的記憶體.(在Sql Server: Buffer Manager裡)

4、資料庫鎖檢查
use maste
go 
declare @spid int,@bl int 
DECLARE s_cur CURSOR FOR 
select  0 ,blocke
from (select * from sysprocesses where  blocked>0 ) a 
where not exists(select * from (select * from sysprocesses where  blocked>0 ) b 
where a.blocked=spid) 
union select spid,blocked from sysprocesses where  blocked>0 
OPEN s_cur 
FETCH NEXT FROM s_cur INTO @spid,@bl 
WHILE @@FETCH_STATUS = 0 
begin 
if @spid =0 
            select ' 引起資料庫死鎖的是 : '+ CAST(@bl AS VARCHAR(10)) + ' 程序號 , 其執行的 SQL 語法如下 ' 
else 
            select ' 程序號 SPID : '+ CAST(@spid AS VARCHAR(10))+ ' 被 ' + ' 程序號 SPID : '+ CAST(@bl AS VARCHAR(10)) +'

阻塞 , 其當前程序執行的 SQL 語法如下 ' 
DBCC INPUTBUFFER (@bl ) 
FETCH NEXT FROM s_cur INTO @spid,@bl 
end 
CLOSE s_cur 
DEALLOCATE s_cur

exe(小寫c) sp_who2

5、看一下工作管理員, 如果Sql Server 佔有的記憶體即使在伺服器最忙得時候都不超過2GB, 而你有4GB記憶體,可以考慮在Windows boot.ini啟動檔案中加入 /3GB變數。這樣SqlServer就可以使用3GB的記憶體,多1GB意味著更大的快取,可以不用到Disk取頻繁讀取了
6、執行profiler,跟蹤器
只選Stored procedure 和 T-Sql, 在Filter(過濾) tab, 選duration(時長)大於5000,這告訴跟蹤器只捕捉執行時間超過5秒的程式。 你可以根據自己的情況調整這個變數。目的是找到製造麻煩的SQL.
7、執行sp_who2 ,看blk by 欄, 如果這欄不是空白,有一個數字, 這就是造成阻塞(blocking)的執行緒id. 然後執行DBCC Inputbuffer(執行緒id), 你就可以看見這個執行緒在幹什麼。
8、確認你的客戶端程式使用connection pooling,並在完成任務後關閉連線。Sqlserver預設255個連線,如果使用connection pooling, 這個值應該足夠應付大多數情況。 如果你確認255不夠,可以使用sp_configure重設這個值
9、如果你不做日常維護,請立即開始。 經常用 DBCC indexDefrag. 每隔一段時間用DBCC DBREINDEX 重建 index. 你可以執行 DBCC Showcontig, 然後看Scan Density ,如果主要的大表Scan Density < 40%, 意味著你有嚴重的Fragmentation(碎片),該用DBCC REINDEX去整理了