oracle性能優化之索引


1.索引的基本概念

一般索引可以提高查詢性能。但是insert,delete,在索引列上的update等操作會變慢(因為要同時對數據和索引都操作)。所以需要平衡索引帶來的查詢性能的提升和對數據修改性能的影響。

查詢一個表的索引,可以用USER_INDEXES 查詢有哪些索引,以及用 USER_IND_COLUMNS 查詢索引有哪些列。
例:

  • select table_name,index_name from user_indexes where table_name = 'XX;
  • selelct table_name, index_name, column_name, column_position
    from user_ind_columns
    order by table_name,index_name, column_name, column_position;

2.不可視索引

可以通過不可視索引,來臨時關閉某個索引來查詢沒有索引時的性能,但是這個索引仍然在維護,可以隨時打開它。

  • alter index idx1 INVISIBLE
  • alter index idx1 VISIBLE
  • create index ... INVISIBLE

3.組合索引

一般組合索引的第一列是最有可能在where子句中使用的列,也是索引中最具選擇性的列。
在索引跳躍式掃描出現之前,組合索引只有在where子句中有出現前導列的時候才會被優化器使用。oracle 9i中增加了索引跳躍式掃描功能使得 在where子句的查詢列是組合索引的第順位之后的字段時依然可能使用索引。
索引掃描方式:

  • 唯一掃描(UNIQUE SCAN),適用於唯一索引,或者是主鍵索引
  • 范圍掃描(RANGE SCAN), 數據庫根據查詢條件從索引中返回多個符合條件的值。

oracle 索引查詢,都是通過每行的ROWID去訪問單行數據,ROWID就是指向單行數據的物理位置的指針。ROWID最好不要硬編碼到代碼中,因為不同版本的ROWID結構會有不同。

4.索引抑制

某些where子句的邏輯會阻止oracle 使用索引:

  • where子句使用不等號,!= ,<>
  • where 子句使用 is null 或is not null
  • where 子句使用LIKE時,以通配符%開頭(如果%放在結尾則可用索引)
  • where 子句對存在索引的列使用函數的時候,比如TRUNC,SUBSTR,TO_DATE,TO_CHAR等。
  • where子句比較不匹配的數據類型,做了隱式類型轉換的時候。比如直接把varchar類型跟number類型,或者是date類型比較的時候。

5.索引的選擇性

索引的選擇性越高,意味着一個索引值返回的行數越少,索引就越好。索引選擇性可以幫助基於成本的優化器來決定執行路徑。
可以用多種方法判斷索引的價值:
1.判斷索引中的唯一鍵或不同鍵的數量
比較不同鍵的數量(USER_INDEXES視圖的DISTINCT_KEYS)和表中行數(USER_INDEXES視圖的NUM_ROWS),就可以知道索引的選擇性。

6.集群因子

集群因子記錄在掃描索引時,需要讀取的數據塊的數量。反映數據相對於已索引的列是否顯得有序。如果集群因子接近於表中數據塊的數量,表示索引對應的數據行的排列情況良好。但是如果集群因子接近於表中數據的行數量,說明排列情況不佳。
使用USER_INDEXES視圖中的CLUSTERING_FACTOR查看。

綜上,索引的選擇性和集群因子相乘,即為該操作的成本。

7.二元高度

二元高度(B樹級別,BLEVEL)是指一個索引從它的根塊到其葉塊的深度。

8 .創建直方圖

構建直方圖可以幫助優化器在表中的數據出現嚴重偏斜時做出更好的規划。

9.快速全掃描

相比於全表掃描,快速全掃描需要更少的物理I/O。當表查詢中的所有列都包括在索引中,且索引的前導列並不在WHERE條件里,可以使用快速全掃描。

10. 跳躍式掃描

在組合索引中,索引的前導列並不在WHERE條件里時,可以用跳躍式掃描。該掃描比索引全掃描更快。
需要使用提示來使用索引的跳躍式掃描,提示可以影響優化器,使它偏向您所指定的路徑。

11.索引的類型

1.B樹索引

B樹索引是oracle創建索引時的默認索引。可以是單列索引,也可以是組合索引,最多為32列。

2.位圖索引

適用范圍
適用於大表上基數(不同值的數量)不高的列上建立位圖索引,最多為30列。由於位圖索引比B樹索引小的多,所以可實現對表的快速訪問,比如sex,基數只有2,男和女。

如果有多個位圖索引,oracle可以合並從每個位圖索引得到的結果。
創建位圖索引sql:
create bitmap index idxname on XXX (aa,bb);
優點
位圖索引很少會向其中添加新的值,所以在批處理的插入中比B樹要好。
缺點

  • 在聯機事務處理中不建議使用位圖索引,因為位圖索引的索引值使用壓縮格式存儲。一個索引值會包含一系列的ROWID,因此oracle在更新一個定值時會鎖定對應的所有ROWID,可能在DML過程造成死鎖。
  • 當執行ALTER TABLE 修改包含位圖索引的列時,位圖索引會失效
  • 基於規則的優化器不會考慮位圖索引。

3.哈希索引

適用范圍
哈希索引在限制條件是確定的值 而不是范圍的情況下很有用。
優點

  • 哈希索引是訪問數據庫數據最快的方法,oracle可以基於哈希函數快速確定行的物理存儲位置。
  • 對包含有序值的靜態數據非常有效。

缺點

  • 創建哈希集群之前必須知道集群鍵不同值的數量。否則可能造成集群的沖突(兩個集群的鍵值用相同的哈希值)。
  • 哈希集群可能浪費空間,因為需要為集群未來增長預留好空間,需要合理評估。同時,由於為未來增長預留好空間,全表掃描會很耗資源。

4.索引組織表

概念
索引組織表會以表的主鍵進行排序,把表的組織結構改成B樹結構。索引組織表提供了一種基於鍵的快速數據訪問機制。
適用范圍
對於總是通過對主鍵的精確匹配或范圍掃描進行訪問的表,可以考慮使用索引組織表。
優點

  • 可以在索引組織表上建立額外的索引。

5.反鍵索引

適用范圍:
磁盤數量有限,同時還需要執行大量有序載入時用。 反鍵索引不能與wei'tu'suo'y或索引組織表結合使用。

6.基於函數的索引

可以在表中創建基於函數的索引,否則在where子句中帶有索引的列如果使用了函數都將不會使用。
但是要注意以下幾點:

  • 加索引列對dml產生的影響(變慢)
  • 是否有足夠的空間應付額外索引
  • 這個索引列函數是否適用於所有情況

7.分區索引

分區索引就是把一個索引分成多個片段,減少需讀取的索引大小,使得訪問更快,也避免I/O競爭。
oracle還支持在分區的表和索引上的並行查詢和並行DML
B樹索引和位圖索引可以分區,哈希索引不可以。
分區索引有兩種類型:本地索引和全局索引。每種類型又分為有前綴和無前綴索引。

  • 本地索引
    本地索引是指與表使用相同的分區鍵和范圍界限的索引,本地索引的每個分區只包含了該表分區的鍵值和ROWID。oracle會自動維護這些本地索引,本地索引的分區也可以被單獨重建。
  • 全局索引
    全局分區索引在一個索引分區中包含來自多個表分區的鍵值。全局索引只能是B樹索引。oracle默認不會自動維護全局索引。

12.快速重建索引

可使用ALTER INDEX中的REBUILD選項,使用已有索引而不是表來快速重建索引。
alter index idx1 rebuild parallel
tablespace cust_tbl
storage (xxx);

13.在線重建索引

可以直接在執行DML語句時創建或者重建索引。
CREATE INDEX index_name ON table (col1,col2) ONLINE;
ALTER INDEX index_name REBUILD ONLINE;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM