Странный план

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

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

Ответить
CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Странный план

Сообщение CyberMax » 10 авг 2006, 12:18

FB 2.0 RC3. Запрос:

Код: Выделить всё

SELECT
    C.ID,
    C.ID_LAW,
    C.ID_SOURCE_FINANCE,
    C.NUMBER
FROM
    DIR_PRIVILEGE_CATEGORY AS C
    LEFT JOIN DIR_PRIVILEGE_SOURCE_FINANCE AS S ON C.ID_SOURCE_FINANCE = S.ID
    LEFT JOIN DIR_PRIVILEGE_LAW AS L ON C.ID_LAW = L.ID
ORDER BY
    C.ID
Сервер выдает такой план:
PLAN JOIN (JOIN (C ORDER PK_DIR_PRIVILEGE_CATEGORY, S INDEX (PK_DIR_PRIVILEGE_SOURCE_FINANCE)), L INDEX (PK_DIR_PRIVILEGE_LAW))
Это правильно - сначала сортировка, затем джойн.

Если же сортировка по неиндексированному полю (например, NUMBER), то план выдается такой:
PLAN JOIN (SORT (JOIN (C NATURAL, S INDEX (PK_DIR_PRIVILEGE_SOURCE_FINANCE))), L INDEX (PK_DIR_PRIVILEGE_LAW))
А вот это странно - сначала джойн, затем сортировка и опять джойн.
По логике, сортировка должна быть либо в начале либо в конце, а никак не в середине. Является ли это багом?

P.S. Тема перемещена из "Общих проблем".

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 18 авг 2006, 15:55

Проверил данный запрос в FB 1.0. План: Sort-Join-Join. В FB 1.5 аналогично.

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

Сообщение dimitr » 25 авг 2006, 10:00

это особенность FB2, багом не является. В случае JOIN-плана абсолютно по барабану, что и когда сортировать - первый поток сразу или результат потом. Вдобавок, перенос внешней сортировки "глубже" зачастую позволяет сортировать меньше записей, что есть гуд.

Ответить