14

エンティティ フレームワーク (または linq-to-sql) でコンパイルされたクエリを SQL Server と組み合わせて使用​​する場合、ストアド プロシージャを使用することで実際にパフォーマンス上の利点はありますか?

コンパイルされたクエリはパラメーター化されたクエリとしてキャッシュされるため、パフォーマンスはストアド プロシージャとほぼ同じになります。ストアド プロシージャのパフォーマンスが大幅に向上する状況はありますか?

- 編集 -

以下の Yakimych の回答に応えて、コンパイルされたクエリがストアド プロシージャと同じであることを意味するつもりはありませんでした。アプリケーション側で可能なすべての最適化を行った場合 (この場合はコンパイルされたクエリ)、sprocs がまだ必要かどうかを判断しようとしています。したがって、ストアド プロシージャが、アプリケーション側の最適化とパラメーター化されたクエリの組み合わせよりも優れている理由を探していると思います (これが、コンパイルされたクエリの効果です)。

私がこれを質問している理由の 1 つは、ストアド プロシージャがさまざまな理由 (つまり、この投稿)で不要になったと考えているように見える人が多いためです。

4

3 に答える 3

9

まず、EF クエリのコンパイルは、ストアド プロシージャを使用することで得られるパフォーマンス上の利点とは何の関係もありません。

http://msdn.microsoft.com/en-us/library/cc853327.aspxによると、クエリが概念モデルに対して実行されると、次の操作が発生します。

  • メタデータの読み込み
  • データベース接続を開く
  • ビューの生成
  • クエリの準備
  • クエリの実行
  • 型の読み込みと検証
  • 追跡
  • オブジェクトの実体化

そして、に関する説明Preparing the query

クエリ コマンドを作成し、モデルとマッピング メタデータに基づいてコマンド ツリーを生成し、返されるデータの形状を定義するためのコストが含まれます。Entity SQL クエリ コマンドはキャッシュされるため、後で同じクエリを実行する場合はさらに時間がかかりません。コンパイル済みの LINQ クエリを使用して、後の実行でこのコストを削減することもできます。

そのため、クエリをコンパイルして後で再利用すると、その後のすべてのクエリ実行中にアプリケーションでこの操作にかかる時間を節約できます。ただし、データベースに対して実行される、生成された SQL コードに影響を与えないようにする必要があります。クエリをコンパイルするときに得られるパフォーマンス上の利点は、アプリケーション レベルにあります。

一方、生成された SQL コードに満足できず、データベース レベルでパフォーマンスを最適化したい場合は、通常、ストアド プロシージャを使用します。

コメントに応じて編集し、編集します

EFクエリをコンパイルすると、データベースに対して実行される生成されたSQLコードが何らかの形で変更されるという印象を受けているようです(コンパイルされたクエリはパラメータ化されたSQLクエリになると述べていますか?)。そうではありません。クエリを直接実行するか使用するかに関係なくcompiledQuery.Invoke同じ SQL コードが DB に対して実行されます。さらに、それを完全に制御することはできず、可能な限り最良の方法で生成するために ORM に依存します。最適でない場合もあり、これが SP の出番です。

要約すると:

  • クエリのコンパイルは、純粋にアプリケーション側の最適化です。コードで再利用されるクエリをコンパイルする時間を節約できます。
  • ストアド プロシージャを使用して SQL コードを微調整し、目標にできるだけ近づけることができるため、データベース レベルで最高のパフォーマンスを得ることができます。

1 つの手法が他の手法の代わりになることは決してありません。

于 2010-09-27T09:35:50.567 に答える
5

「ストアド プロシージャのパフォーマンスが大幅に向上する状況はありますか?」

EF またはストアド プロシージャで生成された同等のパラメーター化された SQL が与えられた場合、それらは同等に実行されます。

ただし、DBA には、DB スキーマとその使用パターンに関する経験に基づいて、クエリをさらに最適化する機会が常にあります。ストアド プロシージャを使用すると、それを使用するアプリケーションを分離してこれを簡単に実行できますが、ORM ではできません。

トリガーを介してデータを複製する外部システムが多数ある非常に複雑な SQL Server DB があります。EF に関する問題は、DBA ではなく ORM を使用する場合、DB で発生する SQL に対する責任がアプリケーション開発者の責任になることです。

于 2010-09-27T14:42:51.477 に答える
3

よく知られている専門家からのいくつかの定型回答: Paul Nielsenなぜストアド プロシージャを使用するのですか?

Adam Machanic:いいえ、ストアド プロシージャは悪くありません

于 2010-09-27T15:03:14.750 に答える