3

私は最近、DBAの強い不承認にもかかわらず、プロジェクトにEntityFrameworkを使用しました。それである日、彼は私のオフィスに来て、自分のデータベースに到達する生成されたT-SQLについて不平を言いました。

たとえば、IDに基づいて商品を選択する場合は、次のように記述します。

context.Products.FirstOrDefault(p=>p.Id==id);

これは

SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id)

それで彼は「一体なぜあなたはSELECT*FROM(SELECT TOP 1)を書くのか」と叫んでいます。

だから私は私のコードをに変更しました

context.Products.Where(p=>p.Id==id).ToList().FirstOrDefault()

これにより、はるかにクリーンなT-SQLが生成されます。

SELECT ... FROM PRODUCTS WHERE ID=@id

内部クエリとTOP1が消えました。十分に混乱しているので、私の質問はこれです:最初のクエリは本当にSQL Serverにオーバーヘッドをかけますか?2番目の方法よりも解析が難しいですか?Id列には、クラスター化インデックスがあります。彼の顔(または私のもの)にそれをこすりつけることができるように、私は良い答えが欲しいです

ありがとう、
Themos

4

1 に答える 1

0

クエリを手動で実行し、実行計画を比較してみましたか?

ここでの最大の問題は、SQLがDBAの標準に完全に適合していないことではありません(ただし、クエリエンジンが余分な選択を最適化することはかなり確信しています)。2番目のクエリは、実際にはProductsテーブルの内容全体を返し、それをメモリ内で分析します。これは間違いなく、アプリケーション層ではなくDBによって実行される必要があるタスクです。

要するに、彼は衒学者です。そのままにしておきます。

于 2012-06-13T11:10:23.113 に答える