Проблемы со скоростью с 3-мя подобными операторами в 1 запросе (оракул) - PullRequest
2 голосов
/ 04 октября 2010

Это фрагмент моего запроса:

and (
    ADDR_FULLTEXT
    like upper(:streets1)
)

Всякий раз, когда я выполняю запрос, частью которого он является, он выполняется примерно за 0,05 секунды.Это потрясающе!Но когда я делаю следующее:

and (
    ADDR_FULLTEXT
    like upper(:streets1)
    AND
    ADDR_FULLTEXT
    like upper(:streets2)
)

, это приводит к 20-секундному запросу.Почему такая большая разница и как ее можно решить?

Что в основном выполняет остальная часть запроса, это выбор нескольких полей в представлении (ADDR_FULLTEXT - одно из них).Там также есть еще один, как этот.

Может быть, я делаю что-то действительно неправильно, и, возможно, для этого есть лучший способ сделать это.

К вашему сведению: цикл PHP генерирует этот запрос, который получается в результатепоисковый запрос.Каждое слово анализируется в этом запросе, что приводит к 1 или более одинаковых «лайков» в 1 запросе.Другой лайк генерируется таким же образом, но это всегда 1 лайк, никогда больше, никогда меньше.

Ответы [ 3 ]

1 голос
/ 04 октября 2010

попробуйте разбить его на два разных запроса и взять пересечение, например:

SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets1)
INTERSECT
SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets2)

см. Пересечь

0 голосов
/ 05 октября 2010

Изменение этого предиката, вероятно, изменяет оценку CBO числа строк, которые будут возвращены таблицей. Это, в свою очередь, может привести к значительной реструктуризации плана, что приведет к изменению показателей.

Дальнейшему анализу придется подождать, пока вы не предоставите запрос (включая представления) и планы запросов.

0 голосов
/ 04 октября 2010

Возможно, у вас будет полное сканирование таблицы для каждого оператора LIKE, а остальная часть вашего запроса использует индексы.

...