DRG-10849 Must hint domain index

April 6th, 2010 | Categories: Boring | Tags:

在一个存在全文索引的表上做全文查询,得到DRG-10849错误。

SQL>  select * from RES_BLOGS where catsearch(AD_TITLE,’oracle’,”)>0 and CREATION_DATE > sysdate;
select * from RES_BLOGS where catsearch(AD_TITLE,’oracle’,”)>0 and CREATION_DATE > sysdate
*
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10849: catsearch does not support functional invocation

SQL> explain plan for select * from RES_BLOGS where catsearch(AD_TITLE,:1,”)>0 and CREATION_DATE > sysdate;
Explained.
———————————————————–|
| Id  | Operation                          | Name          |
———————————————————–|
|   0 | SELECT STATEMENT                   |               |
|   1 |  PARTITION RANGE ALL               |               |
|*  2 |   TABLE ACCESS BY LOCAL INDEX ROWID| RES_BLOGS     |
|*  3 |    INDEX RANGE SCAN                | RES_BLOGS_IX1 |
———————————————————–|
Predicate Information (identified by operation id):
—————————————————
2 - filter(”CTXSYS”.”CATSEARCH”(”AD_TITLE”,:1,”)>0)
3 - access(”CREATION_DATE”>SYSDATE@!)

通过察看执行计划,发现SQL并没有优先选择domain index,而是选择在creation_date上的索引;这样当通过catsearch作filter的时候就报错了。

如上情况,当SQL条件中涉及到包括domain index的多个索引的时候,最好在SQL中显示指定domain index 的提示。确保我们要做的就是全文检索。

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. Zeeno
    April 6th, 2010 at 17:01
    Quote | #1

    为什么不考虑把创建日期的过滤条件放到catsearch里面呢?
    .. ctx_dll.add_index(…,’fo’)
    .. where catsearch(AD_TITLE,:1,’fo > 1234′)>0

    没深入研究。

  2. yumianfeilong
    April 6th, 2010 at 17:29
    Quote | #2

    计划赶不上变化。所以要hint