索引存儲關系到數據庫的運行效率
導讀:在數據庫中,索引與表一樣,不僅需要在數據字典中保存索引的定義,還需要在表空間中為他分配實際的存儲空間,并為其設置存儲參數。數據庫管理員若能夠給索引分配合理的表空間,并且設置合適的參數的話,則可以在一定程度上提高數據庫的運行效率。
雖然說,在建立索引的過程中,不為其指定具體的存儲參數也是可行的。索引會自動繼承所處表空間的默認存儲參數。不過,在數據庫設計過程中,筆者是不建議這么做。因為這不能夠發揮Oracle數據庫高性能的優勢。特別是在一些比較復雜的數據庫設計中,一定要根據實際情況,合理的索引存儲進行配置,以達到數據庫性能優化的目的。
具體的說,數據庫管理員可以從如下幾個方面入手,做好索引的存儲管理。
第一步:為索引指定存儲的表空間。
當數據庫管理員為表或者字段建立索引的時候,可以選擇是否指定具體的表空間。若沒有具體指定的話,則數據庫會自動在用戶的默認表空間創建索引段。這里初學者要注意,索引的存儲默認表空間不是跟著其所對應的數據庫對象走,而是跟著用戶走。也就是說,現在有一張員工信息表,要為其建立一個索引。并不是說這張員工信息表屬于哪個表空間,這對應的索引默認也是哪個表空間。而這個索引的默認表空間是建立這個索引的用戶的默認表空間。
索引是對表中字段進行排序的一種手段。在數據庫管理員創建索引的時候,Oracle首先對建立索引的字段進行排序,然后將排序后的字段值和相應記錄的Rowid存儲在索引段中。而這個數據存儲,就需要用到一定的存儲空間,即我們所為的表空間。若一張表中發索引比較復雜,則其索引本身的空間可能比表中數據所占用的空間還要大。可見,對于索引的表空間進行管理的必要性。
在索引的建立過程中,對于其所存儲的表空間沒有特殊的限制。如不需要像其他數據庫一樣,要求把索引與表建立在同一個表空間或者磁盤上。數據庫管理員可以根據企業自身的需求,合理的為索引分配存儲空間。
不過,筆者認為,最好能夠把表與索引保存在不同的表空間中。因為Oracle數據庫能夠并行讀取不同磁盤中的數據,從而達減少輸入輸入沖突的目的。而現在把索引與其對應的表存放在不同硬盤上的不同表空間中,就可以提高查詢的效率。往往在數據庫性能優化中,調整索引與基礎表的表空間位置,這也是我們數據庫管理員常用的手段之一。故,筆者建議,最好能夠為索引建立一個獨立的表空間,跟其對應的表分開存放。若數據庫服務器有多個磁盤的話,可以考慮分別存放在不同的磁盤上。
另外,若把索引跟對應的表存儲在不同的表空間中的話,在數據庫備份的時候,要稍加注意。因為Oracle數據庫允許數據庫管理員以表空間為單位,對數據庫進行備份與還原。此時,若把它們存儲在不同的表空間的話,則對數據表所在的表空間進行備份的時候,就不會備份索引信息。在還原的時候,也不會自動把表空間對應的索引進行還原。所以,若把索引與表存放在同一個表空間中,則對于數據庫備份來說,要方便一點。但是,這畢竟是次要的。比起數據庫的性能來說,這點困難還是可以克服的。
第二步:為提高更新性能合理配置空閑空間管理方式。
索引不僅跟數據庫的查詢效率息息相關,而且,還跟數據庫的更新有重要的影響。因為要對數據進行更新,往往伴隨著對數據進行查詢。所以,合理設置索引空閑空間的處理方式,可以有效的提高數據庫的更新性能。
數據庫創建索引的時候,主要是通過Pctfree參數來指定為更新操作而預留的空閑空間百分比。如果數據庫管理員把這個參數設置為80%。就表示數據塊中的數據所占用的空間少于總空閑空間的80% 時,可以直接利用這個空閑空間來存儲需要更新的數據。當現有數據塊的數據超過了這個比例后,則發生更新動作時,就需要為其分配新的數據塊了。
可見,當頻繁的為更新作業分配數據塊的時候,會極大的影響數據更新的效率;同時,因為增加新的數據塊,還會耗用服務器的硬件資源,如內存等等。這無疑會影響除了更新作業之外的其他作業,會對整個數據庫的運行性能產生不利的影響。
所以,在創建索引的時候,數據庫管理員要合理的配置這個參數。具體什么參數是合適的,沒有一個嚴格的標準。這主要是根據索引對應的表,是否需要進行頻繁的更新來決定的。當這個索引所對應的表,可能要進行頻繁的變更,則最好能夠為其指定比較大的Pctfree參數,以提高數據庫的更新性能。如對于ERP系統中的訂單變更表或者價格信息表,起碼要把這個參數指定為80%,或者更高。相反,對于系統中不怎么進行更新的產品基本信息表,則可以把這個參數設置為50%,或者更低。
不過,數據庫管理員需要注意,并不是說Pctfree參數設置的越大越好。這主要是因為天下沒有白吃的午餐。Pctfree設置的比較大,并不是說是百利而無一害的。把Pctfree參數設置的偏大,是以犧牲存儲空間未代價的。所以,對于一些更新很好的表,在為其建立索引的時候,沒有必要為其指定比較大的Pctfree參數。我們也可以利用Pctused參數來進行類似的設置。這個參數的用途跟Pctfree大同小異,也是對索引空閑空間管理的一種方式。
另外對于數據庫表更新來說,還有一些索引管理手段,可以提高數據庫的更新性能。
如在企業導入基礎數據的時候,若某需要在某張表中插入大量數據,則此時最好能夠把這張表中的索引先取消掉。因為根據索引的工作機制,每在數據庫表中插入一條記錄的時候,數據庫都要根據插入的數據,更改索引。若插入的記入比較多,而這張表的索引也比較復雜的話,則數據更新的效率就會比較慢。為了提高數據表導入的效率,最好能夠在這個工作之前先把索引都禁用掉。等到導入完畢后,再重新啟用索引。
第三步:為索引指定區分配方式。
在索引創建過程中,雖然可以通過Storage語句來指定存儲空間的區分配方式。但是,筆者覺得這個沒有多大的實際意義。一方面起指定的參數比較少,只能夠指定創建索引時分配的第一個區的大小。另一方面,這對于提高數據庫的性能、索引的管理效率,沒有多大的效果。
所以,筆者在創建索引的過程中,基本上是不用Storage語句來指定其存儲空間的區分配方式。或許其他數據庫管理員有不同的見解,大家可以討論討論。
總之,筆者認為對索引進行優化的時候,主要是涉及到前面兩個方面。一是要把索引跟其對應的表存儲在不同硬盤的不同表空間上。二是若索引所對應的表可能涉及到比較頻繁的更新的話,則可以考慮把Pctfree參數設置的高一點。
【編輯推薦】