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


Короткий ответ заключается в том, что без иерархического расширения (connect by) вы не могли бы написать рекурсивный запрос. Вы можете программно выдавать множество запросов, которые были связаны рекурсивно.
Эмпирическое правило для всех баз данных, особенно для Oracle, заключается в том, что если вы можете выдать свой результат в одном запросе, он почти всегда будет быстрее, чем делать это программно.
Другое правило: не выбирайте больше данных, чем вам нужно. Здесь может быть компромисс. Действительно ли Бену нужно отображать 30 уровней в глубину и до бесконечности?
В моем опыте использовались гораздо меньшие наборы, поэтому я не могу сказать, насколько хорошо иерархические запросы будут выполняться для больших наборов.
При выполнении этих поисков дерева у вас обычно есть следующие параметры
Выполнение всего этого в базе данных сократит количество ненужных циклических обращений или бесполезных запросов, которые извлекают слишком много данных.
Я видел, что использование 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 предоставляет несколько вариантов.
Придете к каким-то выводам?