У нас есть два запроса к нашей базе данных, где единственным отличием является порядок условий в предложении OR.
Запросы с одинаковой структурой прекрасно работают с аналогичным набором данных в другой базе данных.Мы работаем с Oracle 12.2
.
В таблице Bestand
есть две связанные сущности, каждая из которых всегда заполнена.В нашем примере статья связана с KbArticle
всегда null
.В одном из наших запросов мы получаем все результаты, для которых статья id
работает, а в другом случае - нет.Все сущности Bestand выполняют два последних условия (cod_lbr = 12, flg_sperre = 0)
SELECT bestand0_.*
FROM tbl_bestand bestand0_
LEFT OUTER JOIN tbl_kb_artikel customeror1_
ON bestand0_.id_kb_artikel=customeror1_.id_kb_artikel
LEFT OUTER JOIN tbl_artikel article2_
ON bestand0_.id_artikel =article2_.id_artikel
WHERE (customeror1_.id_kb_artikel=3017874 OR article2_.id_artikel =3017874)
AND bestand0_.cod_lbr =12
AND NVL(bestand0_.flg_sperre,0) = 0;
дает результаты Ссылка на объяснительный план
SELECT bestand0_.*
FROM tbl_bestand bestand0_
LEFT OUTER JOIN tbl_kb_artikel customeror1_
ON bestand0_.id_kb_artikel=customeror1_.id_kb_artikel
LEFT OUTER JOIN tbl_artikel article2_
ON bestand0_.id_artikel =article2_.id_artikel
WHERE (article2_.id_artikel =3017874 OR customeror1_.id_kb_artikel=3017874)
AND bestand0_.cod_lbr =12
AND NVL(bestand0_.flg_sperre,0) = 0;
не дает результатов Ссылка на план объяснения
Что не имеет для меня никакого смысла, так как все результаты, которые мы должны получить, соответствуют всем утверждениям в предложении whereв том случае, если вы оставите два последних условия, запрос вернет ожидаемые результаты, поэтому если мы изменим наш запрос на:
SELECT bestand0_.*
FROM tbl_bestand bestand0_
LEFT OUTER JOIN tbl_kb_artikel customeror1_
ON bestand0_.id_kb_artikel=customeror1_.id_kb_artikel
LEFT OUTER JOIN tbl_artikel article2_
ON bestand0_.id_artikel =article2_.id_artikel
WHERE (article2_.id_artikel =3017874 OR customeror1_.id_kb_artikel=3017874);
, мы получим результаты снова Ссылка на объяснениеПлан
Я ожидаю, что оба запроса дадут одинаковые результаты, я не могу понять, почему порядок условий должен каким-либо образом влиять на результат запроса.У нас здесь есть какие-то индексы?Это должно быть специфично для базы данных, поскольку наши запросы отлично работают в другой базе данных, той же версии, с аналогичным набором данных.
** ОБНОВЛЕНИЕ **
К сожалению, запрос с AND OTHER_ID IS NULL
как @kfinity имел ту же проблему, что и запросы выше, что для меня абсолютно бессмысленно.После того, как мы отключили Adaptive Statistics Optimizer , когда @Kuvick упомянул о наших запросах, оба снова получили результаты со следующими планами объяснения:
План объяснения Запрос 1 План объясненияЗапрос 2
Таким образом, отключение оптимизатора решило наши проблемы.