程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> 從數據庫應用系統查找解決阻塞問題

從數據庫應用系統查找解決阻塞問題

編輯:SyBase綜合文章
一個大型數據庫應用系統做得不好,會遇到連接到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教程是:從數據庫應用系統查找解決阻塞問題。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved