Oracle Text を使用して、「AIX」で始まり、部分文字列「XYZ」を含む OS 名を検索するクエリを実行しようとしています。このクエリの定式化では、結果が 0 になりますが、別の部分に分割すると明らかに結果が得られます。
SELECT
COUNT(*) AS cnt
FROM
package_master
WHERE
CONTAINS(doc,'%XYZ%',1)>0 AND UPPER(os) LIKE 'AIX%'
これは 0 件の結果を返します。
しかし、不思議なことに、次のように変更すると:
SELECT
COUNT(*) AS cnt
FROM
package_master
WHERE
CONTAINS(doc,'%XYZ%',1)>0 AND UPPER(os)='AIX 6.1.0.0'
結果を返しますが、もちろん AIX 6.1.0.0 に関連するものだけです...
私はOracle 11g2を使用しています。
ORACLE TEXT パッケージにバグがある可能性はありますか?
2 つの INTERSECT クエリに分割して結果の COUNT(*) を実行できると思いますが、それは問題を複雑にし、長時間実行されるようです...単純な「AND」形式を使用したいと思います....もし可能なら...
これは機能しますが、長時間実行され、不必要に複雑です。
SELECT count(*) FROM (
SELECT
host, package_name
FROM
package_master
WHERE
CONTAINS(doc,'%XYZ%',1)>0
INTERSECT
SELECT
host, package_name
FROM
package_master
WHERE
UPPER(os) LIKE 'AIX%'
)
また、元のクエリで EXPLAIN を実行しようとすると、クエリの「LIKE」部分がまったく実行されていないように見えることにも注意してください...! これはかなり奇妙です:
Plan hash value: 1075233541
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 238 | 55 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 238 | | |
|* 2 | DOMAIN INDEX | PACKAGE_MASTER_IDX7 | 100 | 23800 | 55 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
-
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CTXSYS"."CONTAINS"("DOC",'%XYZ%',1)>0)
filter(UPPER("OS") LIKE 'AIX%')
Oracle Database 11g Enterprise Edition リリース 11.2.0.3.0 - 64 ビット。NLS_COMP 値は BINARY、NLS_SORT 値はヌルです。テーブルは 1 回だけ読み込まれるため、インデックスの同期には問題ありません。