1

これが私のセットアップです:

CREATE TABLE CUSTOMER 
(
  CUSTOMER_ID NUMBER(9, 0) NOT NULL 
, CUSTOMER_NAME VARCHAR2(61 BYTE)
);

CREATE INDEX CTXCAT_CUSTOMER_NAME 
    ON CUSTOMER (CUSTOMER_NAME) INDEXTYPE IS CTXSYS.CTXCAT;

私の(簡略化された)クエリ:

select /*+ INDEX(customer CTXCAT_CUSTOMER_NAME)*/* 
from customer
where CATSEARCH(customer_name,'ltd Anderson',null) > 0 or customer_id > 100

エラー:

コマンドの 1 行目から始まるエラー: select /*+ INDEX(customer CTXCAT_CUSTOMER_NAME) / from customer where CATSEARCH(customer_name,'ltd Anderson',null) > 0 or customer_id > 100 エラー レポート: SQL エラー: ORA-20000: Oracle Textエラー: DRG-10849: catsearch は機能呼び出し 20000 をサポートしていません。 00000 - "%s" *原因: ストアド プロシージャ 'raise_application_error' が呼び出されたため、このエラーが生成されました。*処置: エラー・メッセージの説明に従って問題を修正するか、アプリケーション管理者またはDBAに詳細を問い合わせてください。

ヒントの提案はここから来ました: https://forums.oracle.com/message/2847094明らかに私にはうまくいきません。

解決方法はありますか?

4

1 に答える 1

1

問題は、ほとんどの場合、クエリで Oracle がCATSEARCHインデックスを使用するのではなく、関数呼び出しとして使用することです。これは、OR 条件があり、Oracle がテーブル内のすべての行をチェックする必要があるためです。それが、HINT が役に立たない理由でもあります。実行計画を見せてもらえますか?

おそらくこれを試してください:

select * 
from customer
where customer_id > 100
UNION
select /*+ INDEX(customer CTXCAT_CUSTOMER_NAME)*/ *
from customer
where CATSEARCH(customer_name,'ltd Anderson',null) > 0;

(上記の例ではヒントは必要ありません)

于 2013-10-21T13:21:13.540 に答える