【摘要】隨著企業(yè)的不斷發(fā)展,對數(shù)據(jù)的管理由最初的文檔管理到如今的專門的數(shù)據(jù)庫管理軟件,我們對數(shù)據(jù)的要求越來越高,不但要保證數(shù)據(jù)的安全,還要提高數(shù)據(jù)訪問的速度,數(shù)據(jù)庫中數(shù)據(jù)的存儲直接影響到系統(tǒng)的性能,所以理解數(shù)據(jù)的存儲對提高數(shù)據(jù)的訪問速度及數(shù)據(jù)的檢查是有益的。
1、SYBASE數(shù)據(jù)庫中數(shù)據(jù)的存儲
下面介紹SYBASE數(shù)據(jù)庫中數(shù)據(jù)的分配。數(shù)據(jù)的分配按照物理存儲空間被劃分為以下幾個層次:設(shè)備、段、分配單元、區(qū)間和頁,在這里我們回想一下數(shù)據(jù)庫是如何創(chuàng)建的,首先創(chuàng)建數(shù)據(jù)庫設(shè)備,并將設(shè)備的信息記錄到masters數(shù)據(jù)庫的sysdevices系統(tǒng)表中。數(shù)據(jù)庫段:在create database 時引用一個設(shè)備,將會導(dǎo)致把該設(shè)備上的一部分空間分配為一個數(shù)據(jù)庫段。分配單元、區(qū)間和頁:每個數(shù)據(jù)庫段被分為若干個0.5M的分配單元,每個分配單元被分為32個區(qū)間,一個區(qū)間只能與一個數(shù)據(jù)庫對象關(guān)聯(lián),即數(shù)據(jù)庫對象是以區(qū)間為單位分配的;每個區(qū)間被分為8頁,頁分為數(shù)據(jù)頁、索引頁、分配頁、對象分配映射頁(OAM)、全局分配映射頁(GAM),數(shù)據(jù)頁存儲表中的數(shù)據(jù),索引頁存儲索引項,分配頁是記錄分配單元內(nèi)哪些區(qū)間已被對象使用,哪些頁實際存有數(shù)據(jù),OAM頁記錄一個對象所擁有的那些區(qū)間的分配頁,GAM頁記錄數(shù)據(jù)庫中哪些分配單元還擁有可以存儲對象的區(qū)間。
2、如何優(yōu)化數(shù)據(jù)的存儲,提高數(shù)據(jù)訪問的速度
數(shù)據(jù)的存儲及維護(hù)直接影響到應(yīng)用的性能,在日常的維護(hù)工作中,我們要根據(jù)應(yīng)用的使用情況對重要表通過表分區(qū)及重建索引等方面提高系統(tǒng)性能,根據(jù)以上的有關(guān)數(shù)據(jù)存儲的知識,下面從幾個方面討論如何提高數(shù)據(jù)的查詢、更改等的速度。
2.1建立用戶段單獨存放數(shù)據(jù)庫對象
創(chuàng)建好數(shù)據(jù)庫后,數(shù)據(jù)庫中默認(rèn)有三個段,default、system和syslog段,通常我們把syslog段單獨放在一個數(shù)據(jù)庫設(shè)備上,將數(shù)據(jù)和日志分離,表和索引等數(shù)據(jù)信息存放在default默認(rèn)段上,我們可以創(chuàng)建更多的數(shù)據(jù)庫設(shè)備,自定義用戶段標(biāo)識這些數(shù)據(jù)庫設(shè)備,將某些數(shù)據(jù)庫對象單獨存放,提高數(shù)據(jù)的訪問速度,減少系統(tǒng)的I/O,通過此方式可以控制數(shù)據(jù)的增長,可以將大表分在幾個磁盤上,把頻繁訪問的對象放在單獨的磁盤上,提高系統(tǒng)性能。
2.2數(shù)據(jù)庫和對象存儲分配的檢查及如何優(yōu)化數(shù)據(jù)的存儲
首先我們回顧一下一個新對象的分配步驟:在sysobjects sysindexes syscolumns 中添加新條目;指派空間;創(chuàng)建第一個OAM頁,并在sysindexes中記錄它的邏輯頁號;緊接著第一個OAM頁后初始化第一個數(shù)據(jù)(索引頁),并在其頁頭設(shè)置objid;如果所指派的空間為所指派的分配單元的最后一個可用區(qū)間,更新GAM頁。如果想查表ARC的數(shù)據(jù)存儲分配情況,首先在sysobjects 表中得到id,通過此id號查找sysindexes表中indid=0或indid=1的記錄,通過first得知數(shù)據(jù)頁的首頁,通過dbcc page(dbid,first)得到此頁的詳細(xì)信息,以下詳細(xì)介紹如何檢查及清除頁碎片、區(qū)間碎片和跨區(qū)間碎片,提高數(shù)據(jù)訪問速度:
頁碎片:
數(shù)據(jù)所占用的頁超過了實際的需要,按實際情況每頁上的數(shù)據(jù)量假如能存儲3行的數(shù)據(jù),而實際上只存儲了1行,那么將降低了查詢的效率,與數(shù)據(jù)更緊湊存儲的情況相比,服務(wù)器將不得不進(jìn)行更多得I/O??梢允褂胐bcc checktable,sp_spaceused,dbcc listoam或optdiag確定表的當(dāng)前密度,并將它與由表模式計算出來的最大密度相比較,
消除頁碎片的方法:刪除并重新創(chuàng)建聚簇索引;使用bcp將數(shù)據(jù)導(dǎo)出,清空表后再將數(shù)據(jù)導(dǎo)入;使用select into命令將數(shù)據(jù)導(dǎo)入一個新表,然后刪除原來的表。對于DOL表還可使用reorg rebuild tablename重新壓縮DOL數(shù)據(jù)頁
區(qū)間碎片:
區(qū)間碎片是指一個區(qū)間內(nèi)存在空頁,存在過多的區(qū)間碎片導(dǎo)致I/O速度緩慢,降低系統(tǒng)性能,區(qū)間碎片由于從表中刪除數(shù)據(jù)及在聚簇索引中更新了鍵值導(dǎo)致。使用sp_spaceused,dbcc tablealloc或dbcc listoam確定對象擁有多少已分配但未被使用的頁消除區(qū)間碎片的方法同消除頁碎片的方法。
跨區(qū)間碎片
由于索引頁面拆分或者從頁面上刪除了所有的行引起,數(shù)據(jù)訪問時在區(qū)間之間跳轉(zhuǎn),當(dāng)區(qū)間跳轉(zhuǎn)次數(shù)增加時,掃描的性能和大I/O的效率降低了,使用dbcc pglinkage命令檢查頁鏈,查找其頁號的間隔及前向和后向的跳轉(zhuǎn),消除跨區(qū)間碎片的方法同消除頁碎片的方法。
2.3對表進(jìn)行分區(qū)
對一個表進(jìn)行分區(qū)就是為該表創(chuàng)建多個數(shù)據(jù)頁鏈,一個數(shù)據(jù)頁鏈就是一個分區(qū),對表進(jìn)行分區(qū)有以下幾個方面的優(yōu)點:可以增加并行度來執(zhí)行并行查詢處理,可以對一個表裝載數(shù)據(jù)時使用并向的塊拷貝,分區(qū)使得一個表I/O分布到多個數(shù)據(jù)庫設(shè)備上,對于堆表的插入數(shù)據(jù)操作,分區(qū)提供了多個插入點,對于修改和刪除操作,分區(qū)不會影響性能。
3、對數(shù)據(jù)庫進(jìn)行DBCC檢查
DBCC(Database consistency checker)用于檢查和修正數(shù)據(jù)庫中的不一致性,比如:
服務(wù)器記錄一個頁已經(jīng)分配給一個對象,但該頁不是那個對象頁鏈的一部分,或者反之;頁在頁鏈中沒有正確地指向前一頁或下一頁等問題。數(shù)據(jù)不一致可能由于硬件錯誤、電源不穩(wěn)定等原因?qū)е隆?/p>
結(jié)束語
通過以上內(nèi)容,我們了解了sybase數(shù)據(jù)庫中數(shù)據(jù)是如何存儲分配的,對經(jīng)常訪問的數(shù)據(jù)庫對象我們通過對表的檢查發(fā)現(xiàn)問題,定期對某些表通過重建索引及bcp數(shù)據(jù)等方法消除碎片,通過系統(tǒng)的定時功能,編寫腳本定期對數(shù)據(jù)庫對象進(jìn)行DBCC檢查。在平時的工作中,要對經(jīng)常鎖的用戶表的頁進(jìn)行分析,如果經(jīng)常鎖索引頁,可以通過更改鎖模式等提高性能,了解數(shù)據(jù)的存儲對分析某些問題提供了很大幫助。