Oracle では、同じ階層クエリをさまざまな方法で実行しようとしました: CONNECT BY と再帰 CTE を使用します。実行計画によると、CONNECT BYが望ましいです。
再帰 CTE が Oracle でより高速に動作する場合はありますか (または、再帰 CTE を使用したほうがよい状況はありますか)?
ありがとう。
Oracle では、同じ階層クエリをさまざまな方法で実行しようとしました: CONNECT BY と再帰 CTE を使用します。実行計画によると、CONNECT BYが望ましいです。
再帰 CTE が Oracle でより高速に動作する場合はありますか (または、再帰 CTE を使用したほうがよい状況はありますか)?
ありがとう。
「実行計画によると、CONNECT BYが望ましいです。」
それは驚くべきことではありません。CONNECT BY 構文は、何十年もの間 Oracle ツールボックスの一部であったため、Oracle はオプティマイザを微調整してパフォーマンスの高い方法で処理するために多くの時間を費やしてきました。再帰的 CTE は新しいものです。
また、CBO が再帰 CTE のコストを理解するのは難しいと思います。再帰 CTE はデータ駆動ではなくプログラムであるためです。
一方、多くの人 (初心者だけでなく) は、Oracle の階層構文を理解するのに苦労していますが、再帰は標準的なプログラミング概念です。だからおそらくそれが彼らが役に立つところです。
ちなみに、パフォーマンスが重要な状況では、階層クエリを使用すべきではないと思います。大量のデータを迅速かつ頻繁に階層形式で取得する必要がある場合は、推移閉包を具体化するなど、別のアプローチを検討する必要があります。 詳細をご覧ください。