1. 程式人生 > >使用Oracle函式索引簡單介紹(一般)

使用Oracle函式索引簡單介紹(一般)

如果一個函式(function)或表示式(expression)使用了一個表的一列或多
列,則使用者可以依據這些函式或表示式為表建立索引,這樣的索引被稱為函
數索引(Function-Based Index)。函式索引能夠計算出函式或表示式的值,
並將其儲存在索引中。使用者建立的函式索引既可以是平衡樹型別(B-tree
index)的,也可以是點陣圖型別(bitmap index)的。

用於建立索引的函式可以是一個數學表示式(arithmetic expression),也可以
是使用了 PL/SQL 函式(PL/SQL function),包函式(package function),C
外部呼叫(C callout),或

SQL 函式(SQL function)的表示式。用於建立索
引的函式不能包含任何聚合函式(ggregate function),如果為使用者自定義函
數,則在宣告中必須使用 DETERMINISTIC 關鍵字。例如,

  1. create or replace function f_david(p_value varchar2) return varchar2  
  2.  deterministic is  
  3.  begin  
  4.  return p_value;  
  5.  end;  

如果在一個使用物件型別(object type)的列上建立函式索引,則可以使用此物件的方法(method)
作為函式,例如此物件的 map 方法。使用者不能在資料型別為 LOB,REF,或巢狀表(nested table)的列上

建立函式索引,也不能在包含 LOB,REF,或嵌

套表等資料型別的物件型別列上建立函式索引。

使用函式索引

如果一個 SQL 語句的 WHERE 子句中使用了函式,那麼建立相應的函式索引
(function-based index)是提高資料訪問效能的有效機制。表示式
(expression)的結果經過計算後將被儲存在索引中。但是當執行 INSERT 和
UPDATE 語句時,Oracle 需要進行函式運算以便維護索引。

例如,如果使用者建立了以下函式索引:
CREATE INDEX idx ON table_1 (a + b * (c - 1), a, b);

當 Oracle 處理如下查詢時就可以使用之前建立的索引:
SELECT a FROM table_1 WHERE a + b * (c - 1) < 100;

使用 UPPER(column_name) 或 LOWER(column_name) 函式建立函式索引
(function-based index)有助於與大小寫無關(case-insensitive)的查詢。例如
建立以下函式索引:

CREATE INDEX uppercase_idx ON employees (UPPER
(first_name));

有助於提高以下查詢的效能:
SELECT * FROM employees WHERE UPPER(first_name) =
'RICHARD';

函式索引的依賴性

函式索引(function-based index)依賴於索引定義表示式中使用的函式。如果
此函式為 PL/SQL 函式(PL/SQL function)或包函式(package function),當
函式宣告(function specification)發生變化時,索引將失效(disabled)。

使用者需要被授予(grant)CREATE INDEX 或 CREATE ANY INDEX 許可權才能
建立函式索引(function-based index)。

要想使用函式索引(function-based index):
● 建立索引後,表必須經過分析(analyze)。
● 必須保證查詢的條件表示式不是 NULL 值, 因為 NULL 值不會被儲存到
索引中。

以下各節將講述使用函式索引的其他需求。

定義函式的許可權

函式索引(function-based index)的所有者(owner)必須具備此索引定義中
使用的函式的 EXECUTE 許可權。當 EXECUTE 許可權被收回(revoke)後,
Oracle 則將索引標識為 DISABLED。索引的所有者無須具備此函式的
EXECUTE WITH GRANT OPTION 許可權,即可將索引所在表的 SELECT 許可權
授予(grant)其他使用者。

解決函式索引的依賴性問題

函式索引(function-based index)依賴於她使用的所有函式。如果函式或函式
所在包的宣告(specification)被修改過(或索引所有者對函式的 EXECUTE
許可權被收回),將會出現以下情況:
● 索引被標記為 DISABLED。
● 如果優化器(optimizer)選擇了在標記為 DISABLED 的索引上執行查
詢,那麼此查詢將失敗
● 使用標記為 DISABLED 的索引而執行的 DML 操作將失敗,除非此索引
同時被標記為 UNUSABLE 且初始化引數(initialization parameter)
SKIP_UNUSABLE_INDEXES 被設為 TRUE。

函式被修改之後,使用者可以使用 ALTER INDEX ... ENABLE 語句將索引重新置
為 ENABLE 狀態。