一個大型數據庫應用系統做得不好,會遇到連接到server的進程被另一個正在讀寫數據庫的進程阻塞。這種阻塞數量越來越多,以至於clIEnt端好像死機。連接server越來越慢或導致超時連接不成功是引起阻塞的重要原因。通過對多個已投入運行的數據庫應用軟件的修改優化,我們已能夠解決這種問題。此方法主要從如下幾個方面入手:
1. 檢查所有存儲過程。
存儲過程中如果有語句:
begin tran
select from x where
update y set
if a條件 return(number)
commit tran
那麼a條件成立,則此存儲過程運行時,對x,y表的鎖將不會釋放,從而阻塞其它進程。這時用“sp-who”看該“spid”進程狀態應為“awaiting command”。應將該存儲過程修改為
“begin tran
select from x where
update y set
if a
begin
rollback tran
return(number)
end
commit tran”
2. 檢查存儲過程,將大事物細小化。
金融、電信業務中,經常有一些批量業務,如代發工資、代扣話費等。這種業務一般要用到“cursor”,但應盡量避免以下這種情況:
begin tran
select from x where
declare x-cursor cursor
for
fetch x-cursor into
while @@sqlstatus!=2
begin
update
insert
fetch x-cursor into
end
commit tran
因為,事物中使用的所有表的相關頁在進程提交前一直被鎖,並長時間阻塞所有訪問該頁的進程。應該為:
select from x where
declare x-cursor cursor
for
fetch x-cursor into
while @@sqlstatus!=2
begin
begin tran
update
insert
commit tran
fetch x-cursor into
end
經過這樣修改,既可提高存儲過程的執行速度,又不影響其它網點的業務,阻塞機會有非常明顯的減少。
3. 使用Sybase數據庫設計調優策略及數據庫應用調優策略。
Sybase各種調優策略能夠使存儲過程的運行效率得到明顯提高,運行速度大幅度提高,從而縮短阻塞時間及減少阻塞概率。如下幾個方面會對解決阻塞有明顯效果。
1) 數據庫應用表的設計合理,應盡量避免大表間跨表操作。
2) 索引使用優化,提高讀寫速度。
3) 盡量做到索引覆蓋查詢。
4) 對引起阻塞業務相應存儲過程,根據其特點,使用其他相應的優化措施。
5) 經常對應用表進行update statistic,sp-recompile,改善數據頁的充滿度,提高存儲過程的運行效率。
4. 確定引起阻塞的存儲過程和表的方法。
有了上述解決問題的辦法,怎樣從龐大的應用系統中,尋找相應的存儲過程呢?
首先,當發生阻塞時要及時保留數據庫系統運行的有關現場信息,包括:sp-who、sp-lock的運行結果、master庫sysprocesses表的內容。
sp-who的運行結果可用來查出引起阻塞的進程的spid。通過blk域的值找對應的spid,如果blk值不為0,則該進程被spid=blk值的進程阻塞。這樣找下去,直至找到spid對應的blk值為0,則此spid進程為引起阻塞進程。然後記錄其spid、loginname、hostname、dbname、cmd等。
sp-lock的運行結果可用來查出對哪個表寫操作引起阻塞。根據sp-who得到的spid,找sp-lock結果中對應的locktype為ex-table-blk的一行,取table-id值,通過object-name(table-id)得到表名。
master庫sysprocesses表的內容可用來查出須修改優化的存儲過程。根據spid找到相應行,記錄其status、hostname、cmd、id、linenum等通過object-name(id)得到存儲過程名。得到上述信息可對存儲過程進行修改優化,解決阻塞問題(舉例過程略)。
*****************************************************
推薦跟蹤存儲過程名另一個方法:
dbcc traceon(3604)
dbcc traceoff
權限要夠哦
(aladdin)
*****************************************************
us sp_showplan spid,null,null,null display query plan
( chenfeng825
您正在看的Sybase教程是:從數據庫應用系統查找解決阻塞問題。