はい、外部キーは確かにクエリのパフォーマンスを向上させることができますが、使用しているデータベースと、これらのキーが '強制' 。
外部キーは間違いなく
パフォーマンスを向上させることができ
が読み取り/
なぜその外部キーに複数のテーブルを結合するときに持つOracleとSQL Serverでの
? をチェック/有効にして外部キーを使用すると、クエリオプティマイザは2つのテーブルにあるリレーションに関する追加情報を提供します。親テーブルのレコード同じ量を持っている以下の子供へ比べ
- こと:それ
は子テーブルが、内側のとき親テーブルに参加していること、を知っています表。
- 子のすべてのキーが親のに存在すること。
このすべては、処理される行を見積もる際にクエリオプティマイザを助けます。このエスティメーションが正しいということは、ほとんどの(すべてではないにしろ)ほとんどのクエリオプティマイザにとって本当に重要です。この一般的な事実を
証明は Hadoopのハイブへメタデータの形で外部キーの最近の添加によって見られてすることができます。この追加の目標は、CBO(コストベースオプティマイザー)、this Hive Jira entryの説明に役立ちます...
さらに、ファクトテーブルを使用する場合、外部キーに(ビットマップ)の索引を持つことも、Oracleでのパフォーマンスを改善する: 「ビットマップ・インデックスは、ファクトテーブルまたはテーブルの外部キー列の各々の上に構築されるべきである」 。 明白な理由のために、...
外部キーをfollowingリンクが表示されますコストあなたの余分な挿入/更新データ:余分な作業がFKの
を持っていないと比較してデータベースによる行う必要がありますExplain計画を調べることで、SQLサーバーで簡単に確認できます(例)。
私はPostgresqlを知らないが、FKの効果を検証する私のアプローチはの計画を説明することになるだろう。 FKが有効/無効/削除されているときに、それらは異なっていますか?
[編集] 私は実際にFKのは、PostgreSQLの読み取り性能を実現できることをthis証明が見つかりましたが、この理由は多少異なります。 FK年代が有効になっているので、例のクエリは、よりになるように変更することができます演奏者。
PostgreSQLでは、少なくとも外部キーはパフォーマンスを向上させませんが、INSERT、UPDATE、DELETEまたはTRUNCATEで簡単にチェックされます。しかし、SELECTでは変更を加えないでください。 – MatheusOl
親テーブルのDELETEステートメントのパフォーマンスを向上させるため、データベースに子ローがないかどうかをチェックする必要があります.FKカラムがインデックスされている場合、チェックが速くなります –
PostgreSQLについてはわかりませんが私はそれが例えばMSSQL。それが今助けていないときでさえ、プログラム(特にオプティマイザ/プランナ)がまだ活発に開発されているので、将来的にはそうかもしれません。 – deroby