WITH NOCHECKを使用してFKを追加すると、クエリオプティマイザは生成するクエリプランでこのFKを使用しません。それで、クエリ・オプティマイザは、どのように、なぜ、なぜクエリ・プランを生成するときにFKを考慮することになるか考えていましたか? FKが存在する場合、クエリエンジンにどのようなメリットがありますか?クエリオプティマイザとFK制約
答えて
外部キーが "信頼できる"場合、SQL Serverは、制約の対象となる列が他のテーブルの一意のインデックスにあるという事実を使用できます。 FKが対象とするテーブルとの結合があり、キーにある列のみを使用すると、結合が削除されます。 Order
とProduct
、およびOrder
テーブルがProduct.Id
への外部キーであるProductId
があります
たとえば、あなたが2つのテーブルを持っているとしましょう。次に、オプティマイザは知っていることは、このクエリ:
SELECT Order.Id, Order.ProductId
FROM Order
...と余分はProduct
に参加削除することができます。
SELECT Order.Id, Product.Id
FROM Order
LEFT OUTER JOIN Product ON Product.Id = Order.ProductId
が...このクエリと同じです。これは、Order
に各行のProduct
の行が1つしかなく、値が同じであることがわかっているため、結合を削除してもクエリには影響しません。
Order.ProductId
がNULLでない場合、INNER JOINに対して同じことを実行できます。 null可能な場合は、Product
に行があることがわからないため結合できないため、結合によってOrder
行が削除される可能性があります。それは同じではありません。
ただし、Product.Name
をSELECT句に追加すると、いずれの場合も結合を削除できません。
ええ、私は知っています:それは非常に便利ではないようです。実際には、これが実際に大きな違いを生むケースはあまりありません。通常、動的に生成されたSQLまたはコード生成では、結合が固定され、SELECT句のみが変更されます。
あなたがここにこのことについて読むことができます:それはコラムでは、おそらくいないすべての値ことを意味し、キーは「信頼」ではありません指定された場合WITH NOCHECK
は、違いを理由については
http://explainextended.com/2009/10/15/constraints-and-the-optimizer-in-sql-server-foreign-key/
を制約を満たす。 WITH NOCHECK
は、に制約を適用するだけです。データです。古いデータは前提条件に違反する可能性があるため、SQL Serverはそのデータを安全に処理し、そこに結合を維持します。
他の外部キーテーブルを結合するクエリがあり、外部キー制約がある場合、クエリエンジンは外部テーブルインデックスを利用することができます。
SQL Server Management Studioでクエリの実行計画を確認することでテストできます。クエリ - >実績実行計画を含む。 FKとWITH NOCHECKで試してみてください。
- 1. JPAとネイティブFK制約
- 2. SSIS FK制約エラー
- 3. FK制約は、MySQL
- 4. このFKとFOREIGN KEY制約
- 5. FK関係に基づく制約テーブル
- 6. 3番目のテーブルのFK制約違反を防ぐための制約
- 7. Spring/HibernateのFK制約を持つオブジェクトを削除する
- 8. ASP.Net MVC FK制約付きレコードの削除
- 9. SQLモデル/スキーマ設計、チェック制約、FKまたはテーブル再設計?
- 10. 列名を一致させてFK制約を生成する
- 11. Oracle FKの制約が適用されていません
- 12. FK更新時の参照整合性制約違反
- 13. FK制約を追加する際に権限が不十分です(Oracle)
- 14. ユーザデータのFKにはどのような制約がありますか?
- 15. Oracle EBS r12 - データベース....変換スクリプトでFK '制約のないERDのモデリング
- 16. fk関係が1つのタイプしか持てないように制約
- 17. C#ジェネリックと制約
- 18. カスタムUICollectionViewLayoutと制約
- 19. MySQLとチェック制約
- 20. U-SQLクエリオプティマイザの動作
- 21. Microsoft SQL Server Management Studio - FK制約を追加しようとしました。エラー:「無効な列...」
- 22. JPAはnullが0でFK制約が失敗すると考えています
- 23. 汎用クラスと簡約制約?
- 24. 制約レイアウト変更制約をプログラム
- 25. 制約
- 26. 制約
- 27. 制約
- 28. 制約
- 29. 制約
- 30. 制約
これは可能かもしれませんが、クエリで使用できるインデックスを特定するためにクエリエンジンにFKが必要であるとは思われません。また、FKが存在するという理由だけで、FK列に索引が存在するわけではありません。 –
@Randy - 実際には、FKは_target_テーブルにインデックスが存在するだけでなく、インデックスが一意であることを意味します。これは、dsumが "foreign table index"と言っていることです。しかし、FKが指し示すテーブルにのみインデックスが存在しているわけではありません。 – Tadmas