sqlserver2008 死鎖解決方法及性能優化方法


sqlserver2008 死鎖解決方法及性能優化方法

原文: http://blog.csdn.net/kuui_chiu/article/details/48621939

十步優化SQL Server中的數據訪問

http://tech.it168.com/a2009/1125/814/000000814758_2.shtml

 

關於死鎖:

 

[sql]  view plain  copy
 
  1. sp_who active  --看看哪個引起的死鎖, blk里面即阻塞的spid;  
  2. dbcc inputbuffer(@blk) -- 可以查看是那個sql語句造成的死鎖;  
  3. sp_lock  --看看鎖住了那個資源,objid即被鎖住的資源id;  
  4. select object_name(objid) --可得到受影響的表名;  
 


綜合以上功能,我們可以寫一個自動查找死鎖的存儲過程,如下:

 

查找死鎖.sql

[sql]  view plain  copy
 
  1. SET ANSI_NULLS ON  
  2. GO  
  3. SET QUOTED_IDENTIFIER ON  
  4. GO  
  5. CREATE PROCEDURE Find_Lock  
  6. AS  
  7. BEGIN  
  8. SET NOCOUNT ON;  
  9. declare @spid int,@blk int  
  10. DECLARE cur CURSOR FOR  
  11. select 0 ,blocked  
  12. from (select * from sysprocesses where blocked>0 ) a  
  13. where not exists(select * from (select * from sysprocesses where blocked>0 ) b  
  14. where a.blocked=spid)  
  15. union select spid,blocked from sysprocesses where blocked>0  
  16. OPEN cur  
  17. FETCH NEXT FROM cur INTO @spid,@blk  
  18. WHILE @@FETCH_STATUS = 0  
  19. begin  
  20. if @spid =0  
  21. select '引起死鎖的進程號是 : 'CAST(@blk AS VARCHAR(10)) + ', 其執行的 SQL 語法如下 '  
  22. else  
  23. select '進程號 SPID :'CAST(@spid AS VARCHAR(10))+ '被進程號 SPID : 'CAST(@blk AS VARCHAR(10)) +'阻塞 , 其當前進程執行的 SQL 語法如下'  
  24. DBCC INPUTBUFFER (@blk )  
  25. FETCH NEXT FROM cur INTO @spid,@blk  
  26. end  
  27. CLOSE cur  
  28. DEALLOCATE cur  
  29. END  
  30. GO  
  31. --sqlserver性能優化  
  32. go  
  33. exec sp_configure ”awe enabled”,”1″–內存可以支持64g  
  34. exec sp_configure ”lightweight pooling”,”0″–不使用nt纖程  
  35. exec sp_configure ”priority boost”,”1″–增加sqlserver優先級  
  36. exec sp_configure ”network packet size (b)”,”8192″–增加sqlserver網絡包的大小  
  37. reconfigure with override  
  38. –優化數據庫設置  
  39. declare @currentdatabase sysname  
  40. select @currentdatabase = db_name((select dbid from master.dbo.sysprocesses wherespid = @@spid))  
  41. exec sp_dboption @currentdatabase, ‘select into/bulkcopy’, ‘true’ –對大容量數據操作不記錄日志  
  42. exec  sp_dboption @currentdatabase, ‘trunc. log on chkpt.’, ‘true’ –自動截斷日志  
  43. exec  sp_dboption @currentdatabase, ‘auto create statistics’, ‘true’–自動創建統計  
  44. exec  sp_dboption @currentdatabase, ‘auto update statistics’, ‘true’–自動更新統  
  45. go  



如果你不做日常維護,請立即開始。

經常用 

 

[sql]  view plain  copy
 
  1. DBCC showcontig(表名) 查看表的碎片, 主要查看掃描密度 ,如果主要的大表掃描密度 < 40%, 意味着你有嚴重的碎片可以用  
  2. DBCC indexDefrag (數據庫名,表名)整理碎片或者用  
  3. DBCC DBREINDEX(表名) 重建 index.  



 

 

http://bbs.51cto.com/thread-1024392-1.html 

 

 

執行下面的SQL語句就知道了(下面的語句可以在SQL Server 2005及后續版本中運行,用你的數據庫名替換掉這里的AdventureWorks):

 

 

[sql]  view plain  copy
 
  1. USE master  
  2. go  
  3. SELECT   
  4. object_name(dt.OBJECT_ID,db_id('AdventureWorks')) Tablename,  
  5. si.name  
  6. IndexName,dt.avg_fragmentation_in_percent AS ExternalFragmentation,  
  7. dt.avg_page_space_used_in_percent AS InternalFragmentation  
  8. FROM  
  9. (  
  10.     SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent  
  11.     FROM sys.dm_db_index_physical_stats (db_id('AdventureWorks'),null,null,null,'DETAILED')  
  12.     WHERE index_id <> 0  
  13. AS dt INNER JOIN AdventureWorks.sys.indexes si ON si.object_id=dt.object_id  
  14. AND si.index_id=dt.index_id   
  15. AND dt.avg_fragmentation_in_percent>10  
  16. AND dt.avg_page_space_used_in_percent<75   
  17. ORDER BY avg_fragmentation_in_percent DESC  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM