免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3658 | 回复: 1
打印 上一主题 下一主题

[转贴] Sybase數據庫的碎片整理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-04 18:19 |只看该作者 |倒序浏览
                   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應用的場合,隨著數據的不斷增大,系統變得越來越緩慢,並且經常出現死鎖時,應該檢查數據庫的碎片,並且採用以上方法進行優化。
實際上,應該定期做數據庫的碎片整理,保証數據庫的物理存儲經常處最優狀態,相對增加硬件而言,這是一種更好的保持數據庫性能的低成本的途徑。



论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
2 [报告]
发表于 2003-01-04 21:04 |只看该作者

[转贴] Sybase數據庫的碎片整理

UP
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP