1. 程式人生 > 實用技巧 >sql server2008r2其中一張表不能任何操作

sql server2008r2其中一張表不能任何操作

使用者的資料庫一張高頻表,使用select count(*) from t1 竟然一直在轉圈,顯示開始,而沒有end。

找盡原因不得果。把資料庫備份後在恢復,可以使用幾小時,之後又是老毛病抽風。

使用者生產用系統,從而使用者幾乎停工一天。這個問題就要命了。(原因懷疑其他資料庫系統導致CPU100%引起的)。

初步懷疑是記錄有重複的原因,但是檢查沒有任何問題。

晚上,網上查詢原因,注意到是阻塞死鎖引起的。

文章https://www.cnblogs.com/luna-hehe/p/8658900.html現象完全一致。

執行

declare @spid int,@bl int
DECLARE s_cur CURSOR
FOR select 0 ,blocked from (select * from sys.sysprocesses where blocked>0 ) a where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b where a.blocked=spid) union select spid,blocked from sys.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

出現一大推記錄。真的被堵得死死的。

use master
go
--檢索死鎖程序
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)

kill spid(程序號)殺了幾個後再查,沒有了。在執行sql語句,流暢的很。

用語句檢查

    DBCC showcontig(表名) 查看錶的碎片, 主要檢視掃描密度 ,如果主要的大表掃描密度 < 40%, 意味著你有嚴重的碎片可以用  
    DBCC indexDefrag (資料庫名,表名)整理碎片或者用  
    DBCC DBREINDEX(表名) 重建 index.  

結果碎片一地。通過DBCC indexDefrag (資料庫名,表名)整理碎片,再查98%。問題至此解決。

和資料庫打交道,我們只是簡單使用。如何高併發大資料,問題就來了。因此好好研究學習資料庫的原理方法維護等顯得異常重要了。

==========================

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

原文: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. 

https://www.cnblogs.com/guo2001china/p/6415871.html

=========================================

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  

=======================================