作者: 佘濤
對於像Sybase這樣的大型DBMS系統而言
碎片類型
由於Sybase是通過OAM頁
即本來可以存放在一個頁上的數據卻分散地存儲在多個頁上
在堆表中
當有擴展單元碎片存在
● 對表進行處理時
● 利用較大的I/O操作或增加I/O緩沖區的大小也無法改變較慢的I/O速度
● 行操作的爭用
帶有cluster index的table會由於插入記錄而導致頁分裂
實際上
碎片優化方法
處理碎片有多種方法
本文給出的方法是通過BCP實用程序將用戶數據庫的數據以文本形式導出
下面以Sun Solaris
為防止在數據庫碎片整理過程中出現不可預見的問題
● 創建包含下列SQL語句的文件
cre_bcp_out
select
from sysobjects where type =
order by name
go
● isql
● 編輯輸出文件
● 執行腳本
● 創建包含下列SQL語句的文件
cre_trunc_out
select
order by name
go
● isql
● 編輯輸出文件
● 執行以下語句
isql
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來確保索引的統計信息對應當前表數據的統計。Tw.wiNgwit.CoM
● 創建包含下列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應用的場合,隨著數據的不斷增大,系統變得越來越緩慢,並且經常出現死鎖時,應該檢查數據庫的碎片,並且采用以上方法進行優化。
實際上,應該定期做數據庫的碎片整理,保證數據庫的物理存儲經常處於最優狀態,相對於增加硬件而言,這是一種更好的保持數據庫性能的低成本的途徑。
From:http://tw.wingwit.com/Article/program/Oracle/201311/17019.html