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 字段指定時間條件就會過濾掉絕大部分記錄,剩下的即使全表掃瞄也不會太多,從而影響查詢速度 我們業務基本都是以 時間型別 ...