Производительность иерархических запросов Oracle - PullRequest
1 голос
/ 28 октября 2008

Мы рассматриваем использование иерархических запросов Oracle для моделирования потенциально очень больших древовидных структур (потенциально бесконечно широких и глубиной более 30). Насколько я понимаю, иерархические запросы предоставляют метод для написания рекурсивно присоединяющихся SQL, но они не обеспечивают каких-либо реальных улучшений производительности по сравнению с ручным написанием эквивалентного запроса ... так ли это? Какого рода опыт у людей с точки зрения производительности был при использовании иерархических запросов оракула?

Ответы [ 4 ]

4 голосов
/ 28 октября 2008

Что ж, краткий ответ заключается в том, что без иерархического расширения (связанного с) вы не могли бы написать рекурсивный запрос. Вы можете программно выдавать много запросов, которые были рекурсивно связаны.

Практическое правило для всей базы данных, особенно для оракула, заключается в том, что если вы можете выдать свой результат в одном запросе, он почти всегда будет быстрее, чем программно.

3 голосов
/ 28 октября 2008

Мой опыт был с гораздо меньшими наборами, поэтому я не могу сказать, насколько хорошо будут работать иерархические запросы для больших множеств.

При выполнении поиска по дереву у вас обычно есть эти опции

  • Запросите все и соберите дерево на стороне клиента.
  • Выполните один запрос для каждого уровня дерева, основываясь на том, что вам нужно из предыдущих результатов запроса
  • Используйте встроенные компоненты, предоставляемые Oracle (НАЧАТЬ, ПОДКЛЮЧИТЬ К ПРИОРУ).

Выполнение всего этого в базе данных сократит количество ненужных обращений или ненужных запросов, которые извлекают слишком много данных.

1 голос
/ 29 октября 2008

Попробуйте разделить данные в иерархической таблице, а затем ограничить раздел, включенный в запрос.

CREATE TABLE
    loopy
    (key NUMBER, key_hier number, info VARCHAR2, part NUMBER)
PARTITION BY
    RANGE (part)
    (
    PARTITION low VALUES LESS THAN (1000),
    PARTITION mid VALUES LESS THAN (10000),
    PARTITION high VALUES LESS THAN (MAXVALUE)
    ); 

SELECT
    info
FROM
    loopy PARTITION(mid)
CONNECT BY
    key = key_hier
START WITH
    key = <some value>;

Интересной проблемой теперь становится ваша стратегия разбиения. Oracle предоставляет несколько вариантов.

0 голосов
/ 29 октября 2008

Я видел, что использование connect by может быть медленным, но по сравнению с чем? На самом деле нет другого варианта, кроме создания результирующего набора с использованием рекурсивных вызовов PL / SQL (медленнее) или выполнения на стороне клиента.

Вы можете попытаться разделить ваши данные на отображение (определение иерархии) и таблицы поиска (отображаемые данные), а затем объединить их обратно. Полагаю, я не ожидал бы большой выгоды, если бы вы получали данные иерархии из проиндексированных полей, но это стоит попробовать.

Вы уже пробовали использовать соединение? Я большой поклонник пробовать разные варианты.

...