Внутренний запрос DT "w" возвращает 10 уникальных ID.
В таблице S1_STRWL с такими ID содержится 436 записей.
Два запроса, оба возвращают одинаковые наборы данных, но, судя по статистике,
индексных чтений из S1_STRWL в первом запросе 60774(непонятно), а во втором 436(как и ожидалось).
Соответственно отличается и время выполнения.
Второй запрос отличается дополнительной DT "w1" c группировкой (или distinct).
ЗЫ. Может это так и должно быть, но если всё-таки это неправильное поведение сервера и если в кухне FB ещё об этом неизвестно, то могу выслать огрызок базы с этими таблицами.
Запрос 1:
Код: Выделить всё
select lt.SID
from
(
select l.WID
from S1_STRF f
join S1_STRFL l on (l.ID = f.ID)
where (f.VAL in ( '__к', '_ка', 'кап', 'апо', 'пот', 'ота', 'та_', 'а__'))
group by l.WID
having count(*) >= 5
) as w (ID)
join S1_STRWL lt on (lt.ID = w.ID)
PLAN JOIN (SORT (JOIN (W F INDEX (UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF), W L INDEX (PK_S1_STRFL))), LT INDEX (PK_S1_STRWL))
Execute : 500,00 ms
Read : 36027
Fetches: 142187
Indexed reads: S1_STRWL 60774
Запрос 2
Код: Выделить всё
select lt.SID
from
(
select w1.ID
from
(
select l.WID
from S1_STRF f
join S1_STRFL l on (l.ID = f.ID)
where (f.VAL in ( '__к', '_ка', 'кап', 'апо', 'пот', 'ота', 'та_', 'а__'))
group by l.WID
having count(*) >= 5
) as w1 (ID)
group by w1.ID
) as w (ID)
join S1_STRWL lt on (lt.ID = w.ID)
PLAN JOIN (SORT (JOIN (W W1 F INDEX (UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF, UNQ_S1_STRF), W W1 L INDEX (PK_S1_STRFL))), LT INDEX (PK_S1_STRWL))
Execute : 47,00 ms
Read : 2 417
Fetches: 10 089
Indexed reads: S1_STRWL 436
Таблицы
Код: Выделить всё
CREATE TABLE S1_STRF (
ID INTEGER NOT NULL,
VAL VARCHAR(3) NOT NULL
);
ALTER TABLE S1_STRF ADD CONSTRAINT UNQ_S1_STRF UNIQUE (VAL);
ALTER TABLE S1_STRF ADD CONSTRAINT PK_S1_STRF PRIMARY KEY (ID);
CREATE TABLE S1_STRFL (
ID INTEGER NOT NULL,
WID INTEGER NOT NULL
);
ALTER TABLE S1_STRFL ADD CONSTRAINT PK_S1_STRFL PRIMARY KEY (ID, WID);
CREATE TABLE S1_STRWL (
ID INTEGER NOT NULL,
SID INTEGER NOT NULL
);
ALTER TABLE S1_STRWL ADD CONSTRAINT PK_S1_STRWL PRIMARY KEY (ID, SID);