Страница 1 из 1

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

Добавлено: 10 авг 2006, 12:18
CyberMax
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. Тема перемещена из "Общих проблем".

Добавлено: 18 авг 2006, 15:55
CyberMax
Проверил данный запрос в FB 1.0. План: Sort-Join-Join. В FB 1.5 аналогично.

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