是否有可能從supplierf中進行選擇,其中s.name LIKE'%search%'按照s.name的順序使用索引來執行這樣的搜索?我知道可以爲這個名字創建索引,但對於這樣的搜索我不知道事情是如何工作的。
是的,但Oracle可能會選擇不使用基於統計的索引。您可以告訴Oracle通過提示使用索引,但是索引是否真正起作用取決於您的數據。假設你有這樣的表和索引:
create table t (id integer primary key, text varchar2(50), other_cols...);
create index t_i on t (text);
你再這樣做選擇:
select * from t where text like '%something%';
有兩個明顯的方式這個查詢可以回答:
- 對T全表掃描
- 在T_I上進行全索引掃描,然後在T_I中找到每個結果的TOWID查找。
假設T有100,000行,並且只有5個符合您的搜索條件。假設表格T佔據了5000個塊,並且索引T_I佔據了1000(即只有T的20%)。
查詢的讀入的術語的實際的成本則是:
- 5000讀取(的T)
- 1000讀取(T_I的),接着加入5通過ROWID的T讀取= 1005讀取
顯然在這種情況下,指數更好。但是,Oracle傾向於假定LIKE查詢將返回行(即5000行)的5%,因此其費用估計(在讀)將是:
- 5000讀取(的T)
- 1000通過ROWID = 6000讀取T(T_I)5000個讀取的T讀取
因此,在本例中,雖然索引搜索會更快,但Oracle將進行全表掃描。你可以提示查詢使用索引:
select /*+ index(t t_i) */ from t where text like '%something%';
但是,請注意,這只是更好,如果你確信查詢將返回大部分時間行的不到5%。
+1:如果列的索引尚不存在,Oracle會自動爲主鍵創建索引。 – 2010-01-23 20:25:43
Re(2),儘管Oracle選擇使用索引的可能性很小,但它**有可能創建一個用LIKE'%text%'搜索的索引。如果您確信它會更好地運行,您可以使用提示讓Oracle使用索引。 – 2010-01-24 11:21:16
@Tony Andrews:感謝您提供有關索引的更多信息 - 調整了我的文章並添加了鏈接到您的答案。 – 2010-01-25 07:20:26