FB2.5: DT, join и статистика

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

FB2.5: DT, join и статистика

Сообщение mustafa » 31 окт 2010, 11:06

Firebird 2.5.0.26074

Внутренний запрос 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);

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: FB2.5: DT, join и статистика

Сообщение dimitr » 02 ноя 2010, 23:00

вышли мне огрызок базы на firebird2 на яндекс точка ру, посмотрю в чем там дело

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: FB2.5: DT, join и статистика

Сообщение mustafa » 03 ноя 2010, 17:22

Отправил

Ответить