2014-11-06 67 views
2

所以我有這個表的全文索引列「值」。該字段包含在它的一些數字串,當我使用的查詢,像這樣被正確返回:Oracle CONTAINS()不返回數字結果

select value 
    from mytable 
    where value like '17946234'; 

麻煩的是,因爲在這個表中的很多行這是令人難以置信的慢,但是當我使用CONTAINS運營商我得不到結果:

select value 
    from mytable 
    where CONTAINS (value, '17946234',1)>0 

任何人有任何想法?

不幸的是,我不是一個Oracle花花公子,並且相同的查詢在SQL Server中正常工作。我覺得它必須是一個停止清單或Oracle Lexer的東西,我可以改變,但不知道如何。

回答

0

這可能一般是由於INDEXTYPE IS CTXSYS.CONTEXT,或者索引不是尋找其中添加的記錄後,已更新(CONTEXT類型索引不是事務性的,而CTXCAT型的有)。

但是,如果你不小心在你的聲明中失去了通配符(換句話說:如果沒有通配符確實是必需的。),你可以只查詢

select value from mytable where value = '17946234'; 

這有可能由一個普通的備份指數。 (根據您的具體數據分佈和查詢的運行,指數可能不會幫助查詢性能。) 否則

select value from mytable where instr(value, '17946234') > 0; 

可能就足夠了。

+0

嗨@Abecee - 感謝您的想法。我其實發現問題是什麼。我認爲我們在搜索的字段上使用了CTXSYS.CONTEXT索引,但事實證明這是一個NLS索引,它看起來行爲略有不同......似乎忽略數字字符串,除非它們是貨幣。 所以我已經在那裏添加了一個實際的CTXSYS.CONTEXT索引,並且所有的按預期工作 乾杯 – geckojk 2014-11-12 09:52:51

+0

@geckojk很高興,它解決了。仍然:請仔細檢查,您是否真的需要(通常可能)更昂貴的文本索引。 - 如果像'17946234'這樣的值實際上返回了**所有**所需的記錄,則上面提出的建議應該足夠了(通常更好的表現方式)。 – Abecee 2014-11-12 22:11:48

+0

我們使用文本索引的原因是因爲該字段包含HTML數據(相當大的數量),所以使用LIKE顯示性能很差。 – geckojk 2014-11-13 16:16:47