Код: Выделить всё
select d1.topic d1_1,
dat1.context d1,
dat2.topic d2,
dat3.topic d3,
dat4.topic d4,
t.ddate,
d_s.*
from mydocs t join mydata d on t.dockey = d.dockey
join datalist d_s on d.recno = d_s.recno
left join spr1 dat1 on dat1.recno = d.key_d1
left join spr1 dat2 on dat2.recno = d.key_d2
left join spr1 dat3 on dat3.recno = d.key_d3
left join spr1 dat4 on dat4.recno = d.key_c1
where t.doccode = 2
and t.ddate between :DateStart and :DateEnd
Если убрать все left, на выполнение запроса уходит 2с.
Анализ производительности показывает, что по какой-то причине резко возрастает количество неиндексированных обращений к таблице datalist. С индексом все в порядке.Если убрать left, неиндексированных обращений вообще нет.
Как поднять производительность запроса? Баг ли это сервера?
Вот план в первом случае:
План
PLAN SORT (JOIN (JOIN (JOIN (JOIN (JOIN (D_S NATURAL,D INDEX (RDB$PRIMARY21),T INDEX (RDB$PRIMARY22,mydocs_ddate,mydocs_DOCCODE,mydocs_ddate_D)),dat1 INDEX (RDB$PRIMARY6)),dat2 INDEX (RDB$PRIMARY6)),dat3 INDEX (RDB$PRIMARY6)),dat4 INDEX (RDB$PRIMARY6)))
Адаптированный план
PLAN SORT (JOIN (JOIN (JOIN (JOIN (JOIN (D_S NATURAL,D INDEX (PK_mydata),T INDEX (PK_mydocs,mydocs_ddate,mydocs_DOCCODE,mydocs_ddate_D)),dat1 INDEX (PK_SPR1)),dat2 INDEX (PK_SPR1)),dat3 INDEX (PK_SPR1)),dat4 INDEX (PK_SPR1)))
Вот план во втором случае:
План
PLAN SORT (JOIN (T INDEX (mydocs_ddate,mydocs_DOCCODE,mydocs_ddate_D),D INDEX (RDB$FOREIGN23),dat4 INDEX (RDB$PRIMARY6),D_S INDEX (RDB$PRIMARY88),dat1 INDEX (RDB$PRIMARY6),dat2 INDEX (RDB$PRIMARY6),dat3 INDEX (RDB$PRIMARY6)))
Адаптированный план
PLAN SORT (JOIN (T INDEX (mydocs_ddate,mydocs_DOCCODE,mydocs_ddate_D),D INDEX (FK_mydata),dat4 INDEX (PK_SPR1),D_S INDEX (PK_datalist),dat1 INDEX (PK_SPR1),dat2 INDEX (PK_SPR1),dat3 INDEX (PK_SPR1)))