古詩詞大全網 - 成語故事 - 如何提高Oracle位圖索引的使用效果

如何提高Oracle位圖索引的使用效果

位圖索引是Oralce數據庫索引中的異類,其在某些比較特殊的場合中有突出的表現。壹般來說,位圖索引的效果直接跟列的基數相關。為此在談到如何提高位圖索引的使用效果時,也往往跟這個列的基數相關。為此必須對這個列的基數有壹個清晰的認識。

壹、什麽時候改采用位圖索引

基數是指某個列可能擁有的不重復數值的個數。比如說在壹個中華人民***和國公民的信息表中,包含著十幾億條的記錄。但是在這些記錄中,有幾個比較特殊的列,其指包含幾個有限的重復數值。如性別這壹字段,其就只有男與女兩個可能值;如在民族壹列內也只有56個不重復的值;如在出身地壹列內,中國只有34個省市自治區。

有時候用戶可能需要根據這些列來查詢相關的數據。如公司搞活動的時候,可能需要確認壹下活動有沒有涉及到宗教的禁忌,如可能涉及到回族的禁忌的話,那麽就需要查詢壹下員工信息系統,看看公司有沒有回族的員工。如公司可能在三八婦女節的時候,會給女員工提供壹定的福利,為此也需要在數據庫中拉出女員工的名單,此時也就是根據性別這個字段來查詢數據。等等。如果用戶查詢的列的基數非常的小,只是有限的幾個固定值,如性別、民族、行政區等等。要為這些基數值比較小的列建立索引時,就需要建立位圖索引。如果壹定要說壹個具體的標準的話,那麽筆者認為如果基數值在整個表記錄的2%以內或者字段內容的重復值在100次以上,則通過位圖索引可以起到不錯的效果。

大部分情況下都是通過基數值來確定是否需要使用位圖索引。但是還有壹種比較特殊的情況,可能這個列的基數值非常的大,也就是說這個列中的值重復性不是很高。但是只要起滿足壹定的條件,那麽在這個字段上創建位圖索引,也可以起到不錯的效果。壹般來說,如果字段往往在Where查詢條件語句中被用到,並且采用的運算符為AND

或者OR 的邏輯運算符號的話,那麽其效果也比建議其他索引要好的多。

二、把需要建立位圖索引的列設置為固定長度的數據類型。

在Oracle數據庫中,數據類型從大的來說,包括固定長度的數據類型與可變長度的數據類型。如就拿字符型數據來說,就有固定長度的字符串類型(char)與可變長度的字符串類型(VARCHAR2

)。這兩個數據類型都是字符串數據類型,它們的差別主要在於字符串長度的控制上。CHAR存儲固定長度的字符串。如果實際存儲的字符串沒有達到其規定的最大值的話,則數據庫系統會自動在後面加上空格。而VARCHAR2則主要用來存儲可變長度的字符數據類型。如存儲固定長度的CHAR字符串類型不同,如果在這個列中存儲的數據沒有達到規定的最大值,

則數據庫系統不會在最後加入空格,以實際的字符串存儲。如果從數據庫的體積上來看,肯定是可變長的數據類型比較好。

但是如果從位圖索引的效果上來看,則最好把建立位圖索引的列設置為固定長度的數據類型。因為位圖索引使用固定長度的數據類型要比可變長度的數據類型在性能上要更加的優越。也就是說,如果要在某個字符類型的列上建立位圖索引,那麽最好把這個列的數據類型設置為char(即使其實際存儲的長度不同),而不是設置額外NVCHAR2。因為相對於性能的提升來說,這點空間的損失仍然是值得的。

另外我們也可以通過其他壹些手段來保證列中存儲內存長度的壹致。如拿中國的行政區為例,大部分行政區就是3個字,如浙江省;但是長度比較長的有8個字符,如新疆維吾爾自治區。如果記錄比較多的話,累積下來確實會造成比較大的浪費。在這種情況下,數據庫管理在設計的時候,可以采用壹些折中的處理方式。如利用簡稱來代表各個省份的名字。還有壹種就是在存儲的時候利用數字來表示省份,然後再在另外壹張表中建立數字與省份之間的對應關系。筆者建議采用的是後面壹種方式。

總之如果要為某個列建立位圖索引的話,則數據庫管理員最好能夠想方設法讓這個字段采用固定長度的數據類型,有時候即使犧牲壹點存儲空間也是在所不辭。

三、位圖索引的使用限制。

雖然說位圖索引在基數比較小的列或者使用到邏輯運算符時能夠顯著的提高數據庫的查詢性能,但是其在使用的時候仍然有不少的限制。數據庫管理員需要了解這些限制,如此的話在數據庫設計時才不會竹籃子打水壹場空。

如把某個字段設置為位圖索引的話,最好采用固定長度的數據類型。同時這個長度有最大的限制。在最新的Oracle數據庫版本中,這個位圖索引的最大長度不能夠超過30。不知道以後的版本中會不會放寬這個長度上的限制。如位圖索引不能夠被聲明為唯壹索引;如位圖索引不包含認為列數據,並且不能夠用於任何類型的完整性檢查;如當執行ALTER

TABLE語句並修改包含有位圖索引的列時,這會使位圖索引失效。

最重大的壹個限制是基於規則的優化器不會考慮位圖索引。Oracle數據庫系統在執行壹個SQL之前,首先要分析壹下語句的執行計劃,然後再按執行計劃去執行。分析語句的執行計劃的工作是由優化器來完成的。Oracle的優化器***有兩種的優化方式,即基於規則的優化方式和基於成本的優化方式。基於規則的優化方式是指優化器在分析SQL語句時,所遵循的是Oracle內部預定的壹些規則。基於成本的優化方式是看語句的執行成本。這裏的成本主要指Cpu和內存。優化器在判斷是否用這種方式時,主要參照的是表及索引的統計信息。統計信息給出表的大小、有少行、每行的長度等信息。然後數據庫系統會根據這些信息來確定是否需要采用這個優化方式。另外還有根據這兩個優化模式衍生出來的優化器。

總之數據庫管理理員需要明確的壹點就是,如果要采用位圖索引的話,則最好把數據庫的優化器選擇為基於成本的優化器模式。因為如果數據庫采用的是基於規則的優化器模式的話,則會忽略位圖索引。那麽此時數據庫管理員所建立的位圖索引將壹無用處。這壹點大部分數據庫管理員可能並不清楚,壹定要引以為鑒。

四、同壹個查詢中合並多個位圖索引。

通常情況下在同壹個查詢中合並多個位圖索引後,可以使得數據庫的查詢性能得到顯著的提高。也就是說,如在員工信息表中有性別、婚姻狀態、職稱等字段。這些字段都是基數比較低的字段,可以用來創建位圖索引。如果現在用戶在查詢的時候,需要根據上面這三個字段來查詢員工的信息,如需要查找性別為女、婚姻狀態為已婚、職稱為經理層以上的員工信息,為他們舉行壹個家庭派對的活動。此時在查詢條件中就需要用到這個三個位圖索引字段。數據庫在執行查詢計劃的時候,如果Where字句中包含了這些位圖索引字段的話,擇優化器會依次使用3個單獨的位圖索引。每個位圖記錄指針,用於指示表中哪些行包含位圖中的已知值。有了這些重要信息之後,數據庫會執行壹個位圖AND操作並將從所有的四個位圖中返回哪些行。然後再把這些值轉換為ROWID值,並且查詢繼續完成剩余的處理工作(根據ROWID的值查詢其他的信息)。

也就是說,如果在壹個查詢條件語句中,采用了多個位圖索引來進行查詢的話,其查詢的效果是1+1〉2的效果。為此在應用程序設計中,可以把壹些位圖索引的字段作為查詢條件都放置在查詢窗口中,以明示的方式讓用戶選擇查詢條件。這對於提高應用程序的查詢性能具有很大的幫助。

在Oracle數據庫中壹個表中最大可以支持30個位圖索引。當然實際工作中往往用不了這麽多。因為通常情況下只有在基數值比較小的列上利用這個位圖索引才能夠起到比較好的效果。相反如果在壹些基數值比較大的列上采用位圖索引的話,反而會起到相反的效果。而在壹張表中基數列小的值不會很大。所以說數據庫管理員更加需要關註這些基數列比較小的值。如果用戶有對這些基數值小的列進行查詢的習慣,那麽數據庫管理員就不能夠有任何吝嗇,要馬上把這些列設置為位圖索引。並且在查詢設計的時候,最好能夠在同壹個查詢中合並多個位圖索引,以提高查詢的性能。