2017-03-27 11 views
3

値がインライン化されたEFクエリで定数を指定すると、同じ値を変数として指定した場合、EFはサブクエリを作成し、それをパラメータとして渡すことに気付きました。 2つのアプローチの間にパフォーマンスの違いはありますか?Entity Frameworkクエリで変数または定数を使用する場合のパフォーマンスに差はありますか?

大規模なLinqクエリがありますが、定数を使用するとクエリの実行(およびプランのキャッシュ)とLinqからSQLへの変換の両方でパフォーマンスが向上するかどうか疑問に思っています。

+0

定数はコンパイル時に値に置き換えられ、変数は実行時に計算されます。これは、EFが定数の値をインライン化できますが、変数に対して同じことを実行できない理由です。おそらくパフォーマンスの違いがありますが、質問で提供したデータから見積もることは不可能です。 [あなたの馬を倒す](https://ericlippert.com/2012/12/17/performance-rant/) –

+0

これを測定する最も良い方法は、両方の方法をベンチマークし、多数のテストで結果を記録することです。ネットワークまたはリモートサーバーを使用するベンチマークは、これらのリソースの設定と負荷に応じて異なる結果をもたらすことに注意してください。 –

+0

@ ZoharPeled、私は、インライン定数が実行計画がキャッシュされ再利用されるかどうか、そしてSQLへの変換が高速かどうかに興味があります。私が知る限り、これらの質問はクエリ固有ではなく、すべてのクエリに適用されます。これらの回答に役立つ追加情報はありますか? – adam0101

答えて

1

私はあなたのTechNetからこの記事をチェックアウトをお勧め:

https://technet.microsoft.com/en-us/library/ms175580(v=sql.105).aspx

それはあなたがリテラルを使用する場合、クエリオプティマイザはそれを認識する必要があり、時にはそれがないかもしれないと述べています。

これらのクエリの実行プランとの間の唯一の違いは、ProductSubcategoryID 列との比較のために記憶された値 あります。目標は、SQL Serverが常に ステートメントが基本的に同じプランを生成し、プランを再利用することを認識することですが、SQL サーバーは複雑なSQLステートメントでこれを検出しないことがあります。

"複雑な"と "ときどき"という言葉はかなり具体的な説明ですね。 :)

また、パラメータを使用すると、エンジンがプラン(やはり具体的なもの)を再利用するのに "役立つ"、簡単なパラメータ化と強制パラメタリゼーションについての説明が続きます。

文書には、それが確かではないと書かれていますが、通常これで違いはありません。私自身の経験では、エンジンがEFによって生成されたクエリの定数をかなりよく認識できることがわかりました。私は同じ質問をしばらくしていましたが、Azure SQLについていくつかの点検を行いました。私は、世界で最も複雑に生成されたSQLクエリを調べたとは言いませんが、単純なselect-where-let-joinコンボだけではありませんでした。

もう一度、これは特定のバージョンのエンジンでのクエリでした。確かに、私はあなたも質問の質問を確認することをお勧めしますし、あなたは確信することができます。

関連する問題