11

私はこのような状況があります。今外部キーの制約はOracleのクエリ変換に影響しますか?

create table a(
    a_id number(38) not null, 
    constraint pk_a primary key (id) 
); 

create table b(
    a_id number(38) not null 
); 

create index b_a_id_index on b(a_id); 

b.a_idは、実際にa.a_idを参照する外部キーであることを意味しているが、それは正式にそのように宣言されていません。明らかに、それは完全性の理由のためであるべきです。しかし、外部キーの制約によって、一般的または特定のケースで結合パフォーマンスが向上しますか?はいの場合、どのような種類のクエリ変換ですか?

このトピックに関する関連ドキュメントはありますか?

私は、クエリのパフォーマンスを向上させることができる場所で外部キー制約を持つ、Oracle 11gの(11.2.0.2.0)

答えて

13

はいを​​使用しています。適切な外部キー制約が存在する場合には、オプティマイザに対して一般に公開されていない様々な変換が存在します。たとえば、ABを結合し、データを選択するのはBである場合、オプティマイザは外部キー制約がある場合はクエリ・プランからAを完全に削除することができます(この種の処理は非常に便利です余分なジョインのパフォーマンスコストと既存のビューを使用したコードの再利用を交換する必要がないため、現在のクエリよりも多くのテーブルに参加する便利なビューが必要です。また、データウェアハウス/ DSSタイプ・システムでマテリアライズド・ビューを使用するようにクエリーを書き直すためにクエリー・リライトなどの作業を行うときに便利です。

Tom Kyteには、さまざまな種類の制約と他のメタデータがオプティマイザに与える影響について説明しているMetadata Mattersというプレゼンテーションがあります。

+0

私は前にこのような何かを読んだことが確かでした。それはとにかく明らかです。素晴らしい答えとリンクをありがとう! –

+1

壊れたリンク、私はプレゼンテーションがこれだと思う: http://docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html – gaps96

1

Justinとして既に指摘されているように、JOIN除去は必須の非コストベースのSQL変換であり、メタデータのみの存在に基づいて適用できます。私は最近になってこのことについてブログに書いている:私はもともと想定したよう

、メタデータに依存SQL変換の多くは(その外部キー制約を追加することがあると他の制約)は、確実に正の方法でパフォーマンスに影響を与える可能性があります。