Есть две таблицы, CONT_RES Primary Key=(SERV_ID, RESOURCE, CONT_ID) CONTRACTS Primary Key=(CONT_ID)
Делаем простой запрос select * from cont_res cr join contracts ct on cr.cont_id=ct.cont_id where cr.serv_id=14 and cr.resource='1006980' Получаем план PLAN JOIN (CT NATURAL, CR INDEX (PK_CONT_RES)) и кучу неиндексирванных чтений из CONTRACTS Логика поведения сервера тут совершенно непонятна. У нас есть условия на CONT_RES, с ней соединяется CONTRACTS по первичному ключу. Почему не использовать индекс первичного ключа на CONT_ID? Переписываю запрос: select * from cont_res cr left join contracts ct on cr.cont_id=ct.cont_id where cr.serv_id=14 and cr.resource='1006980' PLAN JOIN (CR INDEX (PK_CONT_RES), CT INDEX (RDB$PRIMARY13)) Вроде все хорошо, и план, и чтений нет, но до момента когда в запросе не ставим cr.resource is null И тут же получаем полное индексированное чтение CONT_RES Зачем? CONT_RES.RESOURCE определен как NOT NULL, и входит в первичный ключ. Почему сразу не понять, что читать ничего не надо? Какими силами можно заставить оптимизатор нормально выполнить простейшее соединение двух таблиц, с условием на одну из них?

