2013-03-30 4 views
1

В Oracle я пытался запускать одни и те же иерархические запросы по-разному: с CONNECT BY и рекурсивным CTE. В соответствии с планом выполнения предпочтительнее CONNECT BY.Когда использовать рекурсивный CTE в Oracle

Есть ли случаи, когда рекурсивный CTE работает быстрее в Oracle (или существуют ли какие-либо ситуации вообще, где их лучше использовать)?

Спасибо.

+1

Рекурсивный CTE предлагает немного больше контроля над фактической рекурсией (сначала глубина, сначала ширина), но кроме этого я не вижу причины предпочитать ее над 'connect by'. –

ответ

2

«В соответствии с планом выполнения предпочтительным является CONNECT BY».

Это неудивительно. Синтаксис CONNECT BY был частью инструментария Oracle на протяжении десятилетий, поэтому у Oracle было много времени, чтобы оптимизировать оптимизатор, чтобы обрабатывать его в совершенстве. Рекурсивные КТЭ новее.

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

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

Кстати, я не думаю, что иерархические запросы должны использоваться в ситуациях, когда производительность имеет решающее значение. Если у вас есть большой объем данных, которые нужно быстро и часто получать в иерархическом формате, вам следует, вероятно, рассмотреть другой подход, например, материализацию транзитивных замыканий. Find out more.

Смежные вопросы