Я пытаюсь использовать Oracle Text для выполнения запроса, в котором я ищу любое имя ОС, которое начинается с «AIX», а также содержит подстроку «XYZ». Каким-то образом эта формулировка запроса приводит к 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 есть ошибка?
Думаю, я могу разбить два запроса INTERSECT и выполнить COUNT(*) результатов, но это усложняет дело и, кажется, выполняется долго... Я хотел бы использовать простую форму "И".... Если возможно...
Это работает, но работает долго и излишне сложно:
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 — null. Таблица загружается только один раз, поэтому с синхронизацией индекса проблем не возникает.
NLS_COMP
иNLS_SORT
- person Frank Schmitt   schedule 27.10.2014