2016-09-08 1 views
1

同僚は、過去にクエリを最適化するために外部キーを使用したと主張しています。私は外部キーは、テーブルにデータを挿入または更新するときにのみ使用されると思います。私は彼らが検索をスピードアップするためにどのように使用できるのか分かりません。インデックス付きの列に外部キーを追加するとパフォーマンスが向上しますか?

実行計画の作成時に外部キーがどのように役立つのですか?何か不足していますか?もしそうなら、それはどんな状況下で助けになるのですか?

(私たちは、私はと多くの経験を持っていないのPostgreSQLを使用しています。それは、異なるOracleやMySQLの、と言うよりも動作することは可能ですか?)

+0

PostgreSQLでは、少なくとも外部キーはパフォーマンスを向上させませんが、INSERT、UPDATE、DELETEまたはTRUNCATEで簡単にチェックされます。しかし、SELECTでは変更を加えないでください。 – MatheusOl

+0

親テーブルのDELETEステートメントのパフォーマンスを向上させるため、データベースに子ローがないかどうかをチェックする必要があります.FKカラムがインデックスされている場合、チェックが速くなります –

+0

PostgreSQLについてはわかりませんが私はそれが例えばMSSQL。それが今助けていないときでさえ、プログラム(特にオプティマイザ/プランナ)がまだ活発に開発されているので、将来的にはそうかもしれません。 – deroby

答えて

4

はい、外部キーは確かにクエリのパフォーマンスを向上させることができますが、使用しているデータベースと、これらのキーが '強制' 。

外部キーは間違いなく パフォーマンスを向上させることができ が読み取り/

なぜその外部キーに複数のテーブルを結合するときに持つOracleとSQL Serverでの

をチェック/有効にして外部キーを使用すると、クエリオプティマイザは2つのテーブルにあるリレーションに関する追加情報を提供します。親テーブルのレコード同じ量を持っている以下の子供へ比べ

  1. こと:それ

    子テーブルが、内側のとき親テーブルに参加していること、を知っています表。

  2. 子のすべてのキーが親のに存在すること。

このすべては、処理される行を見積もる際にクエリオプティマイザを助けます。このエスティメーションが正しいということは、ほとんどの(すべてではないにしろ)ほとんどのクエリオプティマイザにとって本当に重要です。この一般的な事実を

証明は Hadoopのハイブへメタデータの形で外部キーの最近の添加によって見られてすることができます。この追加の目標は、CBO(コストベースオプティマイザー)、this Hive Jira entryの説明に役立ちます...

さらに、ファクトテーブルを使用する場合、外部キーに(ビットマップ)の索引を持つことも、Oracleでのパフォーマンスを改善する: 「ビットマップ・インデックスは、ファクトテーブルまたはテーブルの外部キー列の各々の上に構築されるべきである」 。 明白な理由のために、...

外部キーをfollowingリンクが表示されますコストあなたの余分な挿入/更新データ:余分な作業がFKの

を持っていないと比較してデータベースによる行う必要がありますExplain計画を調べることで、SQLサーバーで簡単に確認できます(例)。

私はPostgresqlを知らないが、FKの効果を検証する私のアプローチはの計画を説明することになるだろう。 FKが有効/無効/削除されているときに、それらは異なっていますか?

[編集] 私は実際にFKのは、PostgreSQLの読み取り性能を実現できることをthis証明が見つかりましたが、この理由は多少異なります。 FK年代が有効になっているので、例のクエリは、よりになるように変更することができます演奏者。

+0

私はさまざまなテーブルでFKを無効にしようとしましたが、実行計画は変わりませんでした。 オプティマイザは、インデックスサイズからテーブルサイズを推測できます。私はFK自体がそれを知らない何かを与えることはできないと思う。 –

+0

ええと、Postgresqlがこの動作ではOracle/SQLサーバと異なるかもしれません。私は本当にそこに効果があるshureです。 親テーブルまたは子テーブルに**行制限フィルタ**を含むクエリを**変更すると、プラン**も同じ** ** fkが有効/無効になっていますか? –

+1

ここで強調しているのは、「パフォーマンスを向上させることができる」ということですね。あなたが言うように、これはオプティマイザにより多くの情報を提供し、結合およびクエリ結果カーディナリティのより良い推定値を与えることができます。結合された列の統計(最大値/最小値/個別値)は、子テーブルの列のすべての値が親テーブルの列に存在することを強く示唆するため、もちろん保証はなく、多くの場合、オプティマイザには影響しません。 –

0

主キーおよびユニーク制約は、対応するインデックスを作成します。しかし、FKは制限されていません。

外部キー制約の宣言では、参照先の列にインデックス が自動的に作成されません。

https://www.postgresql.org/docs/current/static/ddl-constraints.html

だからあなたは正しいです。しかし、多くの場合、FKのインデックスを持つことをお勧めします

関連する問題