14.01.2011 15:56, Александр Свириденков пишет:
Есть две таблицы, 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 Логика поведения сервера тут совершенно непонятна.
Без кол-ва записей в таблицах и селективности индексов гадать бесполезно.
Переписываю запрос: 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, и входит в первичный ключ. Почему сразу не понять, что читать ничего не надо?
А если ты удалишь PK и понапихаешь нуллов, когда запрос уже отпрепарирован и считает, что читать нуллы не надо? :-)
-- Дмитрий Еманов

