Производительность иерархических запросов Oracle

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

Придете к каким-то выводам?

ScottCher 03.11.2008 17:36
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
1
1
5 549
4

Ответы 4

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

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

Другое правило: не выбирайте больше данных, чем вам нужно. Здесь может быть компромисс. Действительно ли Бену нужно отображать 30 уровней в глубину и до бесконечности?

WW. 29.10.2008 09:55

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

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

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

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

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

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

Вы уже пробовали это с помощью Connect by? Я большой любитель пробовать разные варианты.

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

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 предоставляет несколько вариантов.

Другие вопросы по теме