1. ホーム
  2. sql

[解決済み] Oracle DBMS_LOB.INSTRとCONTAINSのパフォーマンス

2022-02-16 01:46:53

質問事項

dbms_lob.instrとcontainsの間にパフォーマンスの違いはありますか、それとも何か間違ったことをしていますか?

以下は私のコードです。

SELECT DISTINCT ha.HRE_A_ID, ha.HRE_A_FIRSTNAME, ha.HRE_A_SURNAME, ha.HRE_A_CITY,  
ha.HRE_A_EMAIL, ha.HRE_A_PHONE_MOBIL
FROM HRE_APPLICANT ha WHERE ha.HRE_A_STATUS_ID=1 AND ha.HRE_A_CURRENT_STATUS_ID <= '7' 
AND ((DBMS_LOB.INSTR(hre_a_for_search,'java') > 0) 
OR EXISTS 
(SELECT 1 FROM gob_attachment, gob_table WHERE hre_a_id=gob_a_record_id 
AND gob_a_table_id = gob_t_id AND gob_t_code = 'HRE_APPLICANT' 
AND CONTAINS (gob_a_document, 'java') > 0))
ORDER BY HRE_A_SURNAME

と最後の2行は instr を使用するために変更されています。

AND dbms_lob.instr(gob_a_document,utl_raw.cast_to_raw('java')) <> 0))
ORDER BY HRE_A_SURNAME

問題は、containsの代わりにinstrを使いたいのですが、instrはcontainsよりかなり遅いように思います。

どうすればいいですか?

CONTAINS は Oracle Text インデックスを使用するので、次のようなものよりはるかに効率的であることが期待されます。 INSTR は実行時に CLOB 全体を読み込まなければなりません。 この2つの文のクエリプランを生成してみると、その違いがOracle Textインデックスに関連していることがわかると思います。

なぜ INSTR よりも CONTAINS ?