Sybase資料庫的碎片整理

2021-04-21 10:59:27 字數 3433 閱讀 3084

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

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

● 從文字中匯入資料: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應用的場合,隨著資料的不斷增大,系統變得越來越緩慢,並且經常出現死鎖時,應該檢查資料庫的碎片,並且採用以上方法進行優化。

實際上,應該定期做資料庫的碎片整理,保證資料庫的物理儲存經常處於最優狀態,相對於增加硬體而言,這是一種更好的保持資料庫效能的低成本的途徑。

SYBASE資料庫總結

sybase中插入資料的方式有 1.insert into b header temp cust record id select min id from c record temp group by out order no 2.select rowid identity 18 t.into b ...

sybase資料庫恢復

一 對tempdb的恢復 測試 在資料庫執行狀態下,在系統中rm刪除了擴充套件的tempdb裝置tempdbdev.dat,initializing virtual device 6,syb data tempdbdev.dat error 822,severity 20,state 2 恢復 停止...

Sybase資料庫簡介

sybase資料庫簡介 八卦一下 剛開始sybase的資料庫一般叫作sybase sql server,你沒仔細瞧還以為是微軟的sql server呢.實際上兩者是有很大關聯的.sql server最初是由microsoft sybase與ashton tate三有公司共同研發的.到最後大家合不來就...