oracle索引 3 函式索引

2021-09-01 22:45:07 字數 1871 閱讀 8237

3.函式索引

可以在表中建立基於函式的索引。如果沒有基於函式的索引,任何在列上執行了函式的查詢都不能使用這個列的索引。例如,下面的查詢就不能使用dt_time列上的索引,除非它是基於函式的索引:

where 1=1 and (sysdate-to_date(dt_time,'yyyymmddhh24miss'))*24*60<10

在dt_time上面加上了索引,但是發現執行計畫並沒有按照索引來,這裡其實是oracle的乙個缺陷了,

例如:dt_time-7下面的查詢就不能使用job列上的索引,除非它是基於函式的索引:

select * from emp where upper(job) = 'mgr';

下面的查詢使用job列上的索引,但是它將不會返回job列具有'mgr'或'mgr'值的行:

select * from emp where job = 'mgr';

可以建立這樣的索引,允許索引訪問支援基於函式的列或資料。可以對列表示式upper(job)建立索引,而不是直接在job列上建立索引,如:

create index emp$upper_job on emp(upper(job));

儘管基於函式的索引非常有用,但在建立它們之前必須先考慮下面一些問題:

1.能限制在這個列上使用的函式嗎?如果能,能限制所有在這個列上執行的所有函式嗎

2.是否有足夠應付額外索引的儲存空間?

3.在每列上增加的索參數量會對針對該錶執行的dml語句的效能帶來何種影響?

4.基於函式的索引非常有用,但在實現時必須小心。在表上建立的索引越多,insert、update和delete語句的執行就會花費越多的時間。

注意:對於優化器所使用的基於函式的索引來說,必須把初始引數query _rewrite _ enabled設定為true。

示例:建立索引前:select  count(*) from  sample where ratio(balance,limit) >.5;

elapsed time: 20.1 minutes

建立索引:    create index ratio_idx1 on sample (ratio(balance, limit));

建立索引後:select  count(*) from  sample where ratio(balance,limit) >.5;

elapsed time: 7 seconds!!!

函式索引限制:

1、必須使用乙個確定的函式定義基於該函式的索引,也就是說函式僅返回乙個值

2、必須使用返回可重複值的函式來定義基於該函式的索引,如sysdate就不行

3、可以對基於函式的索引進行分割槽,但是對基於函式的全域性分割槽索引來說,分割槽鍵不能是索引所基於的函式

4、函式必須使用圓括號來定義,即使沒有引數

5、索引基於的函式不能包含聚合函式

使用建議:

1、不要輕易在字段前面加函式

2、盡量不要將字段嵌入表示式中

3、儘量減少使用函式索引,能不用就不用,因為函式索引的維護代價比普通索引高;函式索引計算值可能大於原字段值,將消耗更多的儲存空間

不要在字段前增加函式

如:to_char(start_time,'yyyy.mm.dd') between '2013.06.06' and '2013.06.10'

和start_time between to_date('2013.06.06','yyyy.mm.dd') and to_date('2013.06.10','yyyy.mm.dd')

任何時候都應該是第二種!!!

不要把字段嵌入到表示式中

如:start_time + 7 < sysdate;

和start_time < sysdate - 7

oracle函式索引

1 使用函式索引使儲存的資料區分大小寫 建表 create table t user usercode varchar2 10 primary key,username varchar2 60 insert into t user usercode,username values uu 小強 ins...

Oracle索引 索引型別

oracle 提供了多種不同型別的索引以供使用。簡單地說,oracle 中包括如下索引 b 樹索引 這些是我所說的 傳統 索引。到目前為止,這是 oracle 和大多數其他資料庫中最常用的索引。b 樹的構造類似於二叉樹,能根據鍵提供一行或乙個行集的快速訪問,通常只需很少的讀操作就能找到正確的行。不過...

oracle索引(函式索引,以時間區分每天)

不是啊,建太多會影響效能的,維護成本也很大 一般在關鍵字段上建立 例如 where 後面有很多字段,其中有 logtime 字段,你在這個欄位上建立索引,查詢是根據 logtime 字段指定時間條件就會過濾掉絕大部分記錄,剩下的即使全表掃瞄也不會太多,從而影響查詢速度 我們業務基本都是以 時間型別 ...