Запрос Oracle очень медленный при сравнении двух значений типа Date - PullRequest
0 голосов
/ 04 июля 2018

Я запрашиваю представление в Oracle, я не уверен, актуально ли оно, но на всякий случай копирую код, который генерирует представление:

    select distinct cpc.Column1, cpc.Column2, //some other fields.. 
    from Table1 cpc inner join Table2 cpob on cpc.brand = cpob.brand 
    and cpc.ship = cpob.ship inner join Table3 cpvi on cpc.voyage = cpvi.voyage

Эти запросы выполняются быстро:

select * from   MyView where rownum <=500 //fast
select * from   MyView where  VOYAGE >= '07-JUL-15'  and rownum <=500 //fast
select * from   MyView where   VOYAGE <= '07-JUL-17' and rownum <=500 //fast

Но когда мне нужно получить данные в соответствии с диапазоном дат, это длится около 40 секунд ... ничего хорошего

select * from MyView where voyage >= '07-JUL-15' 
and voyage <= '07-JUL-17' and rownum <=500  //too slow --- around 40 seconds!

То же самое при использовании between вместо where ... and ... слишком медленно .. Я создал индексы для voyage в таблице, но это все еще медленно. Есть идеи по улучшению производительности этого запроса? Почему это медленно, только когда я добавляю where voyage >= '07-JUL-15' and voyage <= '07-JUL-17'? а не для других запросов?

1 Ответ

0 голосов
/ 04 июля 2018

Вы не сравниваете даты, вы сравниваете строки. Предполагая, что voyage имеет тип DATE, он приводится к строке (используя любой формат даты по умолчанию в вашей базе данных или сеансе) для сравнения со строковыми литералами, которые вы предоставляете в запросе. Это может вызвать все виды сумасшествия в оптимизаторе запросов Oracle.

Я предлагаю вам явно преобразовать строки в даты, например ::10000

VOYAGE >= TO_DATE('07-JUL-15','DD-MON-YY')

или используйте литералы даты, например ::10000

VOYAGE >= date '2015-07-07'

Это может или не может улучшить производительность вашего запроса, но с предоставленной вами информацией, это мой лучший совет. Задавая вопросы о производительности запросов в Oracle, более полезно включить фактическое определение таблицы / представления, любые индексы, присутствующие в таблицах, и фактический план выполнения запросов, который использует Oracle.

(Кроме того, я только что заметил, что ваше представление включает в себя оператор DISTINCT. Это часто не способствует хорошей производительности запросов. Пожалуйста, подумайте, не использовали ли вы DISTINCT, чтобы скрыть какой-то логический недостаток в определении представления, приводящий к тому, что он создает дубликаты. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...