Как я могу получить лучшую производительность иерархического запроса в оракуле - PullRequest
2 голосов
/ 11 октября 2011

У меня есть таблица reply, структура которой выглядит следующим образом:

Id   name   parent_id ...
 1  reply1     0
 2  reply2     1
 3  reply3     2
 4  reply4     3
 5  reply5     4

Эта таблица была построена на иерархической взаимосвязи (вроде parent-> child), как я могу получить все подчиненные ответы согласноидентификатор одного replies?Я хочу использовать один SQL для достижения максимальной производительности.потому что на самом деле объем replies огромен и, вероятно, в одном дереве содержится более 1000 строк.

Я пытался использовать START WITH и CONNECT BY, но это привело к низкой производительности.

Приложение:

Мой ржавый sql:

  SELECT * 
    from reply 
   start with (parent_Id=0 AND id=?) 
 connect by prior Id=parent_Id

Индексируются и Id, и parent_id, оператор "connect by" выглядит дорогостоящим и вызывает высокую загрузку процессораиспользование на стороне базы данных, если одновременно запускается несколько SQL-соединений "connect by".например: 30 потоков: на выполнение одного запроса уходит почти 30 минут

1 Ответ

0 голосов
/ 12 октября 2011

Без реального плана объяснения мы можем только догадываться.

Я думаю, что ваш индекс на parent_id здесь не помогает, поскольку все ваши "деревья" начинаются с корня 0. Я бы сделал этот индекс составным - то есть: (parent_id, id). Это должно ускорить ваше предложение start with, после чего следует использовать индекс id.

...