2013-03-26 44 views
0

只是一個簡單的問題,如何在此查詢上創建基於函數的索引。如何創建Oracle函數索引?

select * from mytable A where :var1 like A.fld1 || '%'; 

mytable在fld1上有一個正常的非唯一索引。

回答

0

好了,你可以您在您的查詢中使用的表達式創建一個基於函數的索引:

create index myindex on mytable (fld1 || '%'); 

然而,這是不太可能的任何好處此查詢。我會說你在fld1上的正常非唯一索引將和基於函數的索引一樣工作。

+0

這很奇怪,但不是,正常的非唯一索引不會像聯邦調查局那樣工作。作者希望在字段中查找更小的字符串,以便在var1中獲得更大的值。例如,如果var1是'JohhDoe',則正確記錄中的一個將具有'John'或'Jo'等等。 – knagaev 2013-03-26 09:20:18

+0

想一想,@knagaev。如果一行有fld1 =''%Johh'',我會感到驚訝,如果你能證明FBI會對查詢與正常索引做出可重複的,可測量的差異。 – 2013-03-26 10:56:12

+0

是的,@Jeffrey Kemp,你說得對。我在運算符||中被'%'的不同行爲搞糊塗了和運營商LIKE。 FBI被創建爲帶鉤符號'%'的fld1的值,但LIKE將其解釋爲通配符。順便說一句,我懷疑正常的索引會有幫助 - 只有全面掃描是可能的,是吧? – knagaev 2013-03-26 12:00:04

1

您不在查詢上創建基於函數的索引,而是在函數上創建它。你在那裏有一個操作員,而不是一個功能。

你想要做的是找到表中fld1與var1開始的字符相匹配的所有行,並且幫助你的索引只是fld1上的一個。這可能是你所希望的最好的計劃是快速全索引掃描,因爲這不適合範圍掃描。

+0

感謝David的回覆。 我看到..我的問題是優化器似乎沒有看到索引作爲一個很好的執行路徑。 CBO不使用索引。 – user2197657 2013-03-27 01:03:54