1. 程式人生 > >sybase——Reorg rebuild 重建表和表上的索引

sybase——Reorg rebuild 重建表和表上的索引

Sybase資料庫的碎片整理
對於像Sybase這樣的大型DBMS系統而言,作為OLTP(聯機事務處理)應用的基石,它需要能每天24小時,每年365天不間斷執行。由於其應用程 序每天對資料庫進行大量的插入、更新、刪除等操作,在資料庫的物理儲存介質上產生了大量儲存碎片,從而影響了儲存的效率以及資料庫應用執行的速度。是否可 以像Windows作業系統的“碎片整理”程式一樣,整理這些碎片,從而優化資料庫儲存,提高資料庫的執行速度呢?答案是肯定的。本文將介紹Sybase 資料庫的碎片型別以及碎片整理方法。
碎片型別
由於Sybase是通過OAM頁、分配單元和擴充套件頁來管理資料的,所以對OLTP應用的Database Server會十分頻繁地進行資料刪除、插入和更新等操作,時間一長就會出現以下幾種情況:
1. 頁碎片
即本來可以存放在一個頁上的資料卻分散地儲存在多個頁上。如果這些頁儲存在不同的擴充套件單元上,Database Server就要訪問多個擴充套件單元,因此降低了系統性能。
2. 擴充套件單元碎片
在堆表中,當刪除資料鏈中間的記錄行時,會出現空頁。隨著空頁的累積,擴充套件單元的利用率也會下降,從而出現擴充套件單元碎片。帶cluster index的table也有可能出現擴充套件單元碎片。
當有擴充套件單元碎片存在,會出現以下問題:
● 對錶進行處理時,常常出現死鎖;
● 利用較大的I/O操作或增加I/O緩衝區的大小也無法改變較慢的I/O速度;
● 行操作的爭用。
3. 擴充套件單元遍歷
帶有cluster index的table會由於插入記錄而導致頁分裂,但當刪除記錄後,頁會獲得釋放,從而形成跨幾個擴充套件單元和分配單元的資料,而要訪問該資料就必須遍歷 幾個擴充套件單元和分配單元。這將導致訪問/查詢記錄的時間大大延長,開始時資料庫的效能雖然較高,但使用一段時間後效能就會下降等問題。
實際上,資料在儲存空間上排列得越緊密有序,Database Server訪問的速度就越快,消除碎片有助於提高系統的效能和更有效地利用資料儲存空間。
碎片優化方法
處理碎片有多種方法,如重新定義table的填充因子,根據table的定義刪除並重新建立索引、重建表等。
本文給出的方法是通過BCP實用程式將使用者資料庫的資料以文字形式匯出,然後將使用者資料庫徹底清空、截斷,再將文字資料匯入到資料庫,從而達到消除碎片的目的,具有通用性。
下面以Sun Solaris 7作業系統下的Sybase Adaptive Server Enterprise 11.5為例,說明整理資料庫資料的具體方法。
1. 備份資料庫
為防止在資料庫碎片整理過程中出現不可預見的問題,有必要先備份資料庫。
2. 建立bcp out指令碼並匯出資料
● 建立包含下列SQL語句的檔案:
cre_bcp_out.sql
select “bcp” + name + “out ./” + name + “_out.txt -Udboname -Pdbopwd -Ssys_name -c”
from sysobjects where type = ‘U’
order by name
go
● isql -Udboname -Pdbopwd -Ssystemname < cre_bcp_out. sql > b_out
● 編輯輸出檔案,去掉檔案第一行和最後兩行無關的字元:vi b_out
● 執行指令碼,將資料庫的資料匯出到文字檔案:sh b_out
3. 建立truncate table指令碼並截斷資料庫
● 建立包含下列SQL語句的檔案:
cre_trunc_out.sql
select “truncate table” + name from sysobjects where type = ‘U’
order by name
go
● isql -Udboname -Pdbopwd -Ssystemname < cre_ trunc_out. sql > trunc_out. sql
● 編輯輸出檔案,去掉檔案第一行和最後兩行無關的字元,並在最後一行加入 go構成完整的SQL語句:vi trunc_out
● 執行以下語句,清空資料庫的資料:
isql -Udboname -Pdbopwd < trunc_out. sql
4. 建立bcp in指令碼並匯入資料
● 建立包含下列SQL語句的檔案:
cre_bcp_in. sql
select “bcp” + name + “in ./” + name + “_out.txt -Udboname -Pdbopwd -Ssys_name -c”from sysobjects where type = ‘U’
order by name
go
● isql -Udboname -Pdbopwd -Ssystemname < cre_ bcp_in. sql > b_in
● 編輯輸出檔案,去掉檔案第一行和最後兩行無關的字元:vi b_in
● 從文字中匯入資料:sh b_in
5. 更新資料庫狀態
Sybase不自動維護索引的統計資訊,當用truncate table截斷資料庫時,索引並沒有改變,所以必須用update statistics來確保索引的統計資訊對應當前表資料的統計。
● 建立包含下列SQL語句的檔案:
cre_upd_st. sql
select “update statistics” + name from sysobjects where type = “U” order by name
go
● isql -Udboname -Pdbopasswd -Ssystemname < cre_upd_st. sql > upd_st. sql
● 編輯輸出檔案,去掉檔案第一行和最後兩行無關的字元,在最後一行加入 go構成完整的SQL語句:
vi upd_st. sql
● 更新資料庫狀態:
isql -Udboname -Pdbopasswd -Ssystemname < upd_st. sql
至此,基本上完成了資料庫使用者表的碎片整理工作。
小 結
在整理過程中,有以下兩點需要注意:
1. Tempdb的大小
當Sybase執行bcp in指令碼時,會佔用匯入資料2倍的tempdb空間,因此在執行前要仔細估計最大的table的大小,保證有足夠的tempdb空間。當空間不夠時,要考 慮用分割table或刪除陳舊資料的方法縮小table的大小,或者考慮增加tempdb的大小。
2. 資料庫配置選項的設定
當資料庫執行bcp in指令碼時會產生大量的log,為保證bcp in程序不致因為log溢位而中斷,應該設定database的選項“truncate log on chkpt”為“true”。
雖然Sybase資料庫是自優化的,但只要資料庫是動態的,資料庫碎片現象就會存在。在OLTP應用的場合,隨著資料的不斷增大,系統變得越來越緩慢,並且經常出現死鎖時,應該檢查資料庫的碎片,並且採用以上方法進行優化。