原文: http://blog.csdn.net/kuui_chiu/article/details/48621939
十步優化SQL Server中的數據訪問
http://tech.it168.com/a2009/1125/814/000000814758_2.shtml
關於死鎖:
- sp_who active --看看哪個引起的死鎖, blk里面即阻塞的spid;
- dbcc inputbuffer(@blk) -- 可以查看是那個sql語句造成的死鎖;
- sp_lock --看看鎖住了那個資源,objid即被鎖住的資源id;
- select object_name(objid) --可得到受影響的表名;
綜合以上功能,我們可以寫一個自動查找死鎖的存儲過程,如下:
查找死鎖.sql
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE Find_Lock
- AS
- BEGIN
- SET NOCOUNT ON;
- declare @spid int,@blk int
- DECLARE 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 cur
- FETCH NEXT FROM cur INTO @spid,@blk
- WHILE @@FETCH_STATUS = 0
- begin
- if @spid =0
- select '引起死鎖的進程號是 : '+ CAST(@blk AS VARCHAR(10)) + ', 其執行的 SQL 語法如下 '
- else
- select '進程號 SPID :'+ CAST(@spid AS VARCHAR(10))+ '被進程號 SPID : '+ CAST(@blk AS VARCHAR(10)) +'阻塞 , 其當前進程執行的 SQL 語法如下'
- DBCC INPUTBUFFER (@blk )
- FETCH NEXT FROM cur INTO @spid,@blk
- end
- CLOSE cur
- DEALLOCATE cur
- END
- GO
- --sqlserver性能優化
- go
- exec sp_configure ”awe enabled”,”1″–內存可以支持64g
- exec sp_configure ”lightweight pooling”,”0″–不使用nt纖程
- exec sp_configure ”priority boost”,”1″–增加sqlserver優先級
- exec sp_configure ”network packet size (b)”,”8192″–增加sqlserver網絡包的大小
- reconfigure with override
- –優化數據庫設置
- declare @currentdatabase sysname
- select @currentdatabase = db_name((select dbid from master.dbo.sysprocesses wherespid = @@spid))
- exec sp_dboption @currentdatabase, ‘select into/bulkcopy’, ‘true’ –對大容量數據操作不記錄日志
- exec sp_dboption @currentdatabase, ‘trunc. log on chkpt.’, ‘true’ –自動截斷日志
- exec sp_dboption @currentdatabase, ‘auto create statistics’, ‘true’–自動創建統計
- exec sp_dboption @currentdatabase, ‘auto update statistics’, ‘true’–自動更新統
- go
如果你不做日常維護,請立即開始。
經常用
- DBCC showcontig(表名) 查看表的碎片, 主要查看掃描密度 ,如果主要的大表掃描密度 < 40%, 意味着你有嚴重的碎片可以用
- DBCC indexDefrag (數據庫名,表名)整理碎片或者用
- DBCC DBREINDEX(表名) 重建 index.
http://bbs.51cto.com/thread-1024392-1.html
執行下面的SQL語句就知道了(下面的語句可以在SQL Server 2005及后續版本中運行,用你的數據庫名替換掉這里的AdventureWorks):
- USE master
- go
- SELECT
- object_name(dt.OBJECT_ID,db_id('AdventureWorks')) Tablename,
- si.name
- IndexName,dt.avg_fragmentation_in_percent AS ExternalFragmentation,
- dt.avg_page_space_used_in_percent AS InternalFragmentation
- FROM
- (
- SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
- FROM sys.dm_db_index_physical_stats (db_id('AdventureWorks'),null,null,null,'DETAILED')
- WHERE index_id <> 0
- ) AS dt INNER JOIN AdventureWorks.sys.indexes si ON si.object_id=dt.object_id
- AND si.index_id=dt.index_id
- AND dt.avg_fragmentation_in_percent>10
- AND dt.avg_page_space_used_in_percent<75
- ORDER BY avg_fragmentation_in_percent DESC
