パフォーマンスに注意する:
少なくともEF Coreでそれを経験しましたでは、ここで与えられた異なる回答が異なるパフォーマンスをもたらす可能性があること。OPがLinq to SQLについて質問したことは承知していますが、EF Coreでも同じ質問が発生するようです。
私が処理しなければならなかった特定のケースでは、Marc Gravellによる(構文的に優れた)提案により、クロス適用内に左結合が発生しました-Mike Uが説明したのと同様に- この結果、この特定のクエリの推定コストは2でしたクロス結合のないクエリと比較して倍の時間。サーバーの実行時間は3倍の差がありました。[1]
Marc Gravellによるソリューションは、クロス結合のないクエリをもたらしました。
コンテキスト:基本的に、2つのテーブルで2つの左結合を実行する必要があり、それぞれのテーブルで別のテーブルへの結合が必要でした。さらに、左結合を適用する必要があるテーブルで他のwhere条件を指定する必要がありました。さらに、メインテーブルに2つの内部結合がありました。
推定オペレーターコスト:
- クロス適用:0.2534
- クロス適用なし:0.0991。
サーバーの実行時間(ミリ秒)(クエリは10回実行され、SET STATISTICS TIME ONを使用して測定されます):
- クロス適用:5、6、6、6、6、6、6、6、6、6、6
- クロス適用なし:2、2、2、2、2、2、2、2、2、2、2
(最初の実行は両方のクエリで遅くなりました。何かがキャッシュされているようです。)
テーブルサイズ:
- メインテーブル:87行、
- 左結合の最初のテーブル:179行。
- 左結合の2番目のテーブル:7行。
EF Coreバージョン:2.2.1。
SQL Serverのバージョン:MS SQL Server 2017-14 ...(Windows 10)。
関連するすべてのテーブルには、主キーのみのインデックスがありました。
私の結論:生成されたSQLは実際には異なる可能性があるため、常に確認することをお勧めします。
[1]興味深いことに、MS SQL Server Management Studioで「クライアント統計」を設定すると、反対の傾向が見られました。つまり、クロス適用なしのソリューションの最後の実行に1秒以上かかりました。私はここで何かがうまくいかなかったと思います-多分私のセットアップで。