解決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
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
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 master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select 0 ,blocked
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去整理了