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 и понапихаешь нуллов, когда запрос уже отпрепарирован и считает, что читать нуллы не надо? :-)


--
Дмитрий Еманов

Ответить