熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

索引存儲關系到數據庫的運行效率

2013-11-13 12:39:54  來源: SQL語言 

  在Oracle數據庫中數據庫管理員不僅在索引的選擇上要花費一定的精力而且在索引的存儲上也有所講究因為索引與表一樣不僅需要在數據字典中保存索引的定義還需要在表空間中為他分配實際的存儲空間並為其設置存儲參數數據庫管理員若能夠給索引分配合理的表空間並且設置合適的參數的話則可以在一定程度上提高數據庫的運行效率

  雖然說在建立索引的過程中不為其指定具體的存儲參數也是可行的索引會自動繼承所處表空間的默認存儲參數不過在數據庫設計過程中筆者是不建議這麼做因為這不能夠發揮Oracle數據庫高性能的優勢特別是在一些比較復雜的數據庫設計中一定要根據實際情況合理的索引存儲進行配置以達到數據庫性能優化的目的

  具體的說數據庫管理員可以從如下幾個方面入手做好索引的存儲管理

  第一步為索引指定存儲的表空間

  當數據庫管理員為表或者字段建立索引的時候可以選擇是否指定具體的表空間若沒有具體指定的話則數據庫會自動在用戶的默認表空間創建索引段這裡初學者要注意索引的存儲默認表空間不是跟著其所對應的數據庫對象走而是跟著用戶走也就是說現在有一張員工信息表要為其建立一個索引並不是說這張員工信息表屬於哪個表空間這對應的索引默認也是哪個表空間而這個索引的默認表空間是建立這個索引的用戶的默認表空間

  索引是對表中字段進行排序的一種手段在數據庫管理員創建索引的時候Oracle首先對建立索引的字段進行排序然後將排序後的字段值和相應記錄的Rowid存儲在索引段中而這個數據存儲就需要用到一定的存儲空間即我們所為的表空間若一張表中發索引比較復雜則其索引本身的空間可能比表中數據所占用的空間還要大可見對於索引的表空間進行管理的必要性

  在索引的建立過程中對於其所存儲的表空間沒有特殊的限制如不需要像其他數據庫一樣要求把索引與表建立在同一個表空間或者磁盤上數據庫管理員可以根據企業自身的需求合理的為索引分配存儲空間

  不過筆者認為最好能夠把表與索引保存在不同的表空間中因為Oracle數據庫能夠並行讀取不同磁盤中的數據從而達減少輸入輸入沖突的目的而現在把索引與其對應的表存放在不同硬盤上的不同表空間中就可以提高查詢的效率往往在數據庫性能優化中調整索引與基礎表的表空間位置這也是我們數據庫管理員常用的手段之一筆者建議最好能夠為索引建立一個獨立的表空間跟其對應的表分開存放若數據庫服務器有多個磁盤的話可以考慮分別存放在不同的磁盤上

  另外若把索引跟對應的表存儲在不同的表空間中的話在數據庫備份的時候要稍加注意因為Oracle數據庫允許數據庫管理員以表空間為單位對數據庫進行備份與還原此時若把它們存儲在不同的表空間的話則對數據表所在的表空間進行備份的時候就不會備份索引信息在還原的時候也不會自動把表空間對應的索引進行還原所以若把索引與表存放在同一個表空間中則對於數據庫備份來說要方便一點但是這畢竟是次要的比起數據庫的性能來說這點困難還是可以克服的

  第二步為提高更新性能合理配置空閒空間管理方式

  索引不僅跟數據庫的查詢效率息息相關而且還跟數據庫的更新有重要的影響因為要對數據進行更新往往伴隨著對數據進行查詢所以合理設置索引空閒空間的處理方式可以有效的提高數據庫的更新性能

  數據庫創建索引的時候主要是通過Pctfree參數來指定為更新操作而預留的空閒空間百分比如果數據庫管理員把這個參數設置為%就表示數據塊中的數據所占用的空間少於總空閒空間的% 時可以直接利用這個空閒空間來存儲需要更新的數據當現有數據塊的數據超過了這個比例後則發生更新動作時就需要為其分配新的數據塊了

  可見當頻繁的為更新作業分配數據塊的時候會極大的影響數據更新的效率;同時因為增加新的數據塊還會耗用服務器的硬件資源如內存等等這無疑會影響除了更新作業之外的其他作業會對整個數據庫的運行性能產生不利的影響

  所以在創建索引的時候數據庫管理員要合理的配置這個參數具體什麼參數是合適的沒有一個嚴格的標准這主要是根據索引對應的表是否需要進行頻繁的更新來決定的當這個索引所對應的表可能要進行頻繁的變更則最好能夠為其指定比較大的Pctfree參數以提高數據庫的更新性能如對於ERP系統中的訂單變更表或者價格信息表起碼要把這個參數指定為%或者更高相反對於系統中不怎麼進行更新的產品基本信息表則可以把這個參數設置為%或者更低

  不過數據庫管理員需要注意並不是說Pctfree參數設置的越大越好這主要是因為天下沒有白吃的午餐Pctfree設置的比較大並不是說是百利而無一害的把Pctfree參數設置的偏大是以犧牲存儲空間未代價的所以對於一些更新很好的表在為其建立索引的時候沒有必要為其指定比較大的Pctfree參數我們也可以利用Pctused參數來進行類似的設置這個參數的用途跟Pctfree大同小異也是對索引空閒空間管理的一種方式

  另外對於數據庫表更新來說還有一些索引管理手段可以提高數據庫的更新性能

如在企業導入基礎數據的時候若某需要在某張表中插入大量數據則此時最好能夠把這張表中的索引先取消掉因為根據索引的工作機制每在數據庫表中插入一條記錄的時候數據庫都要根據插入的數據更改索引若插入的記入比較多而這張表的索引也比較復雜的話則數據更新的效率就會比較慢為了提高數據表導入的效率最好能夠在這個工作之前先把索引都禁用掉等到導入完畢後再重新啟用索引

  第三步為索引指定區分配方式

  在索引創建過程中雖然可以通過Storage語句來指定存儲空間的區分配方式但是筆者覺得這個沒有多大的實際意義一方面起指定的參數比較少只能夠指定創建索引時分配的第一個區的大小另一方面這對於提高數據庫的性能索引的管理效率沒有多大的效果

  所以筆者在創建索引的過程中基本上是不用Storage語句來指定其存儲空間的區分配方式或許其他數據庫管理員有不同的見解大家可以討論討論

  總之筆者認為對索引進行優化的時候主要是涉及到前面兩個方面一是要把索引跟其對應的表存儲在不同硬盤的不同表空間上二是若索引所對應的表可能涉及到比較頻繁的更新的話則可以考慮把Pctfree參數設置的高一點


From:http://tw.wingwit.com/Article/program/SQL/201311/16344.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.