日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 函数索引

發布時間:2024/4/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 函数索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?http://bbs.51cto.com/thread-26271-1.html

如何創建oracle函數索引

Oracle8i的很重要的一個新特性就是增加了function-based index這種索引類型(后面簡稱為FBI)。
有了這個特性后,Oracle DBA就可以在索引中使用函數或者表達式了。這些函數可以使Oracle自己的函數,
也可以使用戶自己的PL/SQL函數等。

DBA在SQL語句調優的過程中遇到的一個很常見的問題就是,如何優化那些在WHERE子句中使用了函數的語句。
因為在以前,在WHERE子句中使用函數會使在這個表上創建的索引沒法利用,從而難以提高這個語句的性能。
例子:

使用基于成本的優化器,索引為標準的B樹索引,建立在SURNAME列上。
SQL>create index non_fbi on sale_contacts (surname);
SQL>analyze index non_fbi compute statistics;
SQL>:analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts
WHERE UPPER(surname) = 'ELLISON';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'SALES_CONTACTS' (Cost=3 Card=16 Bytes=272)
從SQL*PLUS的autotrace產生的執行路徑可以看到,雖然我們在WHERE子句中用到的SURNAME列上創建了索引,但是仍然執行的是全表掃描。如果這張表很大的話,這回消耗大量的時間。
現在我們試著建立一個FBI索引:
SQL>create index fbi on sale_contacts (UPPER(surname));
SQL>analyze index fbi compute statistics;
SQL>analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts WHERE UPPER(surname) = 'ELLISON';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 INDEX (RANGE SCAN) OF 'FBI' (NON-UNIQUE) (Cost=2 Card=381 Bytes=6477)

從SQL*Plus返回的執行計劃我們可以看到,這次,Oracle對表不再全表掃描,而是先掃描索引,因為優化器可以知道FBI索引得存在。
使用FBI索引所能夠帶來的性能提升取決于表的大小、表中重復記錄的量、在WHERE子句中使用的列等因素。
有一點需要清楚,FBI索引并不真正在索引里邊存儲了表達式的結果,而是使用了一個“表達樹”(expression tree)。

由優化器來對SQL語句中的表達式進行解析,并且和FBI索引上面的表達式進行對比。這里,SQL函數的大小寫時敏感的。
因此要求SQL語句中使用的函數和創建FBI索引得時候的那個SQL函數的大小寫一致,否則無法利用這個FBI索引。
因此,在編程的時候要有一個良好的編程風格。
Init.ora里邊需要修改的參數
下面這幾個參數必須在init.ora里邊指定:
QUERY_REWRITE_INTEGRITY = TRUSTED
QUERY_REWRITE_ENABLED = TRUE
COMPATIBLE = 8.1.0.0.0 (or higher)

授權:
要使一個用戶能夠創建FBI索引,他必須被授予以下權限:CREATE INDEX和QUERY REWRITE,或者CREATE ANY INDEX和GLOBAL QUERY REWRITE這兩個權限。
索引的使用者必須能夠有那個FBI索引上使用的那個函數的執行權限。如果沒有相應的權限,那么這個FBI索引得狀態將變成DISABLED(DBA_INDEXES)。
如果那個FBI索引得狀態是DISABLED,那么DBA可以這樣來處理:
a:刪除并重建
B:ALTER INDEX index_name ENABLED。這個Enabled只能對FBI索引使用。
C:ALTER INDEX UNUSABLE;
注意:如果一個查詢中使用到了這個索引,但是這個FBI索引的狀態是DISABLED,但是優化器選擇了使用這個索引,那么將會返回一個Oracle錯誤。
例子:
ORA error:
ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled.
而且,一旦這個FBI索引的狀態是Disabled,那么這張表上所有涉及索引列的DML操作也將失敗。除非這個索引得狀態變成UNUSABLE,而且在初始化參數里邊指定SKIP_UNUSABLE_INDEXES為TRUE。

一些例子:

SQL>CREATE INDEX expression_ndx
ON mytable ((mycola + mycolc) * mycolb);

SQL>SELECT mycolc FROM mytable
WHERE (mycola + mycolc) * mycolb

復合索引的例子:

SQL>CREATE INDEX example_ndx
ON myexample (mycola, UPPER(mycolb), mycolc);

SQL>SELECT mycolc FROM myexample
WHERE mycola = 55 AND UPPER(mycolb) = 'JONES';

限制和規則總結:

對于下面這些限制,不能創建FBI索引:
a) LOB 列
b) REF
c) Nested table 列
d) 包含上面數據類型的對象

FBI索引必須遵守下面的規則:

a) 必須使用基于成本的優化器,而且創建后必須對索引進行分析
b) 不能存儲NULL值。因為任何函數在任何情況下都不能返回NULL值。
c)如果一個用戶定義的PL/SQL例程失效了,而且這個例程被FBI索引用到了,那么相應的這個FBI索引會變成DISABLED
d)創建FBI索引得函數必須是確定性的。即,對于指定的輸入,總是會返回確定的結果。
e) 索引的屬主如果沒有了在FBI索引里面使用的函數的執行權限,那么這個FBI索引會變成DISABLED.
f) 在創建索引得函數里面不能使用SUM等總計函數。
g)要把一個DISABLED了的索引重新變成ENABLED,這個函數必須首先是ENABLED的才可以。

?

總結

以上是生活随笔為你收集整理的oracle 函数索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。