Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CONNECT BY PRIOR ID = PARENT


EternalWonderer ©   (2002-12-10 17:26:00) 

Задача: получить иерархическое представление с упорядочением по алфавиту внутри каждой ветви.

Имеем две таблицы, оччень похожие, структура:
CREATE TABLE CATALOG_SI
(
ID NUMBER(4) NOT NULL,
PARENT NUMBER(4),
CAPTION VARCHAR2(50) NOT NULL,
...
CREATE UNIQUE INDEX CATALOG_SI_PK0 ON CATALOG_SI (ID)
CREATE UNIQUE INDEX CATALOG_SI_UC1 ON CATALOG_SI
(PARENT, CAPTION)


При выполнении запроса
SELECT ID, (LEVEL - 1) l_parent, caption, is_type
FROM catalog_si
START WITH PARENT = 0
CONNECT BY PRIOR ID = PARENT

Первая таблица выводит строки как надо (см. задачу), а вторая - как попало (видимо, в порядке ввода), зараза, пока в запрос не добавишь строку вида
/*+ INDEX (CATALOG_si CATALOG_si_UC1) */

План запроса без хинта:
SELECT STATEMENT Hint=CHOOSE
CONNECT BY
INDEX FAST FULL SCAN CATALOG_SI_UC1
TABLE ACCESS BY USER ROWID CATALOG_SI
TABLE ACCESS FULL CATALOG_SI

С хинтом:
SELECT STATEMENT Hint=CHOOSE
CONNECT BY
INDEX FAST FULL SCAN CATALOG_SI_UC1
TABLE ACCESS BY USER ROWID CATALOG_SI
TABLE ACCESS BY INDEX ROWID CATALOG_SI
INDEX RANGE SCAN CATALOG_SI_UC1

Вопрос 1: отчего первой таблице НЕ требуется хинт? (впрочем, ответ, похоже, очевиден: оптимизатор выбирает разные планы запроса - он же не знает, что мы хотим по афавиту, и для первой таблицы, видимо, у него это получается случайно :)
Вопрос 2: есть ли другой, более "правильный" способ решения задачи (поскольку мне не нравится это самое случайно)?


petr_v_a   (2002-12-11 19:31:00) [1]

>EternalWonderer (11.12.02 16:37)
>Отсюда вопрос: это случайность или правило?
Все, что явно не описано в документации или в "нотах" техподдержки - случайность, хотя бы и похожая на закономерность, IMHO


EternalWonderer   (2002-12-11 16:37:00) [2]

petr_v_a © (10.12.02 17:49)
..."случайностям" не доверяю...
Отлично, мы сходимся во мнениях. Замечу, что сортировка дерева на клиенте - весьма длительная процедура при определённых условиях... Однако при использовании указанного хинта и вторая таблица у меня выводится "как надо".

Отсюда вопрос: это случайность или правило?

Или по - другому: если я буду применять этот хинт во всех случаях, буду ли я получать гарантированно ожидаемый результат?

Sergey13 © (11.12.02 11:58)
Поглядел. Для 9 версии - ясно. Но для 8i лучше я буду пока обходиться хинтами, если, конечно, это даёт гарантию правильного результата (см. выше).


Sergey13   (2002-12-11 11:58:00) [3]

EternalWonderer (10.12.02 17:26)
Поглянь сюда. Похоже.
http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=17699


petr_v_a   (2002-12-10 17:49:00) [4]

До 9-й версии способа нет (:
9-ю версию кроме самых отчаянных никто на живых данных пока не использует :)
Лично я в подобных ситуациях сортирую потом в TreeView на клиенте, "случайностям" не доверяю, но это мой подход, его не навязываю


Наверх

Титульная страница Поиск, карта сайта Написать письмо