Проблема с датой сравнения в Oracle 11.2.0.2.0 - PullRequest
2 голосов
/ 15 декабря 2011

Я столкнулся со странным поведением СУБД Oracle.С SQL, приведенным ниже, набор результатов пуст.Если я удаляю одно из условий «this_.order_date> =» - он возвращает ожидаемые 2 строки.

SELECT DISTINCT this_.id AS y0_,
   this_.order_date         AS y1_
 FROM flight_trip_orders this_,
   int_work_order_info iwoi1_,
   state_history_records cs2_
 WHERE this_.work_info_id           =iwoi1_.id
 AND iwoi1_.state_history_records_id=cs2_.id
 AND this_.order_date              <=to_timestamp('12/16/2011', 'mm/dd/yyyy')
 AND this_.order_date              >=to_timestamp('12/13/2011', 'mm/dd/yyyy')
 AND this_.order_date              >=to_timestamp('12/15/2011', 'mm/dd/yyyy')
 AND rownum <=2;

Как это могло произойти?Результаты запроса различаются в двух разных экземплярах Oracle, но обе версии 11.2.0.2.0

. Пожалуйста, не предлагайте оптимизировать запрос и удалять условия - запрос сгенерирован, и я не могу его изменить

РЕДАКТИРОВАТЬ: Добавление подсказки "ALL_ROWS" помогает с проблемой.Проблема в том, что я не могу добавить эту подсказку в реальном приложении, как описано выше.

Ответы [ 4 ]

2 голосов
/ 15 декабря 2011

Если ваше описание проблемы точное, похоже, это может быть ошибка оптимизатора.Возможно, избыточные условия плохо обрабатываются и приводят к неправильному использованию фильтра.Первое, что я хотел бы сделать, это посмотреть план выполнения для полного запроса и запроса без условия «13.12.2011» и найти различия, особенно в применяемых предикатах.

1 голос
/ 17 декабря 2011

В этом случае оптимизатор делает ошибку. Поскольку вы работаете в 11gR2, вы можете использовать SPM, чтобы заставить оптимизатор использовать тот же - принятый - план для SQL, независимо от того, что еще происходит со статистикой.

Включите управление планами sql, примите ваш правильный план и исправьте его. Не забудьте документировать причину, обычно мы не хотим иметь ИСПРАВЛЕННЫЕ планы. См. Использование SQL Plan Management для деталей.

0 голосов
/ 15 декабря 2011

Существует два способа отфильтровать записи:

  • с условием WHERE
  • через объединение с другими таблицами: int_work_order_info и state_history_records

EXPLAIN PLAN в обеих версиях оператора может показать, как применяется фильтрация.

Но я бы попробовал удалить ключевое слово "DISTINCT" вместе с фильтрами и посмотреть, в чем их отличие.Возможно ли, что существует несколько записей с одинаковыми значениями для (flight_trip_orders.id и flight_trip_orders.order_date), но с разными work_info_id?Тогда что из этого будет отрубать DISTINCT?

0 голосов
/ 15 декабря 2011

this_.order_date <= может ожидать две строки, но другие условия также оцениваются.Итак, одно из других условий false.

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