powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса
3 сообщений из 3, страница 1 из 1
Оптимизация запроса
    #38984693
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with recursive
  DOCS (ID, PARENT) as
  ( select 1,  null from RDB$DATABASE union all
    select 2,  null from RDB$DATABASE union all
    select 3,  2 from RDB$DATABASE union all
    select 4,  2 from RDB$DATABASE union all
    select 5,  10 from RDB$DATABASE
  )
  -- select * from docs
  ,TREE (ID, PARENT, LVL) as
  (
     select D1.ID, D1.PARENT, 0
     from DOCS D1
       left join DOCS D2 on D1.PARENT = D2.ID
     where D2.ID is null
     union all
     select D1.ID, D1.PARENT, TREE.LVL + 1
     from DOCS D1
       join TREE on TREE.ID = D1.PARENT
   )
   select * from TREE


Есть вот такой запрос. DOCS - довольно сложный запрос, возвращает список документов, от 10 до 500 записей.
Нужно получить дерево, но у некоторых документов PARENT смотрит в никуда, т.е. родительских документов нет. Такие документы выводятся на нулевом уровне (LVL), например запись с ID = 5.
Проблема в том, что FB не материализует DOCS, и уже на 50 документах получаю тормоза.
Можно ли как то заставить его материализовать DOCS, либо решить задачу по другому, или только GTT???
PS. Пробовал добавлять order by в DOCS и +0 в объединение, не помогло.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38984758
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут две проблемы.

1. Для outer join не работают алгоритмы hash/merge
2. В рекурсивном запросе DOCS вообще будет перевыполняться на каждой иттерации

Посмотрел я в расширенном плане что там происходит на тройке

explain plan
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Select Expression
    -> Recursion
        -> Filter
            ->  Nested Loop Join (outer)
                -> Union
                    -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                    -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                    -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                    -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                    -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                -> Filter
                    -> Union
                        -> Table "RDB$DATABASE" as "TREE D2 RDB$DATABASE" Full Scan
                        -> Table "RDB$DATABASE" as "TREE D2 RDB$DATABASE" Full Scan
                        -> Table "RDB$DATABASE" as "TREE D2 RDB$DATABASE" Full Scan
                        -> Table "RDB$DATABASE" as "TREE D2 RDB$DATABASE" Full Scan
                        -> Table "RDB$DATABASE" as "TREE D2 RDB$DATABASE" Full Scan
        -> Filter
            -> Union
                -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan
                -> Table "RDB$DATABASE" as "TREE D1 RDB$DATABASE" Full Scan


не понятно почему нельзя соединять результаты рекурсии с DOCS через HASH JOIN с хешированием DOCS конечно же.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38985188
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, примерно так и предполагал. Спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]