Есть две таблицы,
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, и входит в первичный ключ.
Почему сразу не понять, что читать ничего не надо?

Какими силами можно заставить оптимизатор нормально выполнить
простейшее соединение
двух таблиц, с условием на одну из них?

Ответить