0

Oracle のサブクエリから返された値がインデックスを失うかどうかを知りたいです。

select * from emp where empid = 1
-- empid is indexed
select t1.* from (select t2.* from emp t2) t1 where t1.empid = 1  
-- t1.empid  is still indexed?
4

3 に答える 3

1

クエリ最適化プロセスの一部は、提供されたクエリの構造を単純化することです。これは通常、IN と EXISTS を結合に置き換え、述語をインライン ビューにプッシュし、サブクエリを完全に排除することを意味します。

実際、この動作は非常に一般的であるため、述語のプッシュ、サブクエリのマージ、およびその他のクエリ変換が意図せずに不利になることを防ぐために特別に設計されたいくつかの手法 (たとえば、オプティマイザ ヒント、または共通のテーブル式、または特定の論理的に冗長な句) があります。

デフォルトでは、論理的に可能な場合、サブクエリとインラインビューが親クエリにマージされることを期待する必要があります。他の人が言及したように、これはあなたの例ではほぼ確実です。

もちろん、これらすべてから、サブクエリまたはインライン ビューを使用しても、インデックスやクエリ リライト、またはその他のさまざまなパフォーマンス向上手法を使用するオプティマイザの機能が損なわれることは通常ありません。

于 2013-06-11T09:36:15.530 に答える
0

この質問には簡単な答えはありません。はいの場合もあれば、いいえの場合もあります。それは多くの要因に依存します。一般に、理論に深く入り込むのではなく、このようなスタイルのクエリの記述を安全に避けるようにしてください。つまり、ほとんどの場合、ビューは良くありません。詳細については、 http://www.orafaq.com/tuningguide/push%20predicates.htmlを参照してください。

于 2013-06-11T12:34:05.147 に答える