1

linq to sql 関数のクエリ速度に奇妙な矛盾があります。MVC アプリケーションから呼び出す関数があります。これは常に非常に遅く、7 秒程度です。SQL Management Studio から同じ関数を呼び出すと、遅い場合もあれば速い場合もあります (数分の 1 秒)。いつ遅くなるのか、いつ正確に速くなるのかはわかりませんが、一貫した結果が得られる 1 つのサイクル (MVC アプリケーションが常に遅いことを除く) を見つけました。

  • クエリはアプリケーションで実行されます。これは遅いです。
  • LINQ が実行するのとまったく同じようにクエリを実行します。これは の形式sp_execute N' select [some] [select] [clauses] from functionname(@p0)', 'declare @p0 decimal(9,0)', @p0=123456789です。これも、最初の実行時と連続した実行時に遅くなります。
  • フォームで「ラップされていない」クエリを試しますselect [some] [select] [clauses] from functionname(123456789)。これは、連続実行でもまだ遅いです。
  • 関数の変更 [...] で関数を再定義します。
  • 元の sp_execute クエリの実行は依然として遅く、また censecutive の実行でも同様です。
  • アンラップされた関数の実行は高速です。本当に速い。
  • 元の sp_execute クエリの実行も非常に高速になりました。@p0 パラメータも異なります。
  • クエリはアプリケーションで実行されます。ゆっくりに戻りました。

なぜこれが起こるのか、どうすればそれを改善できるのか、私は完全に完全に困惑しています. キャッシュされた実行計画などと関係があるように感じますが、何が起こっているのか、またはそれを修正する方法を正確に知るには十分ではありません. 誰が何が起こっているのか知っていますか?

4

3 に答える 3

1

これは、パラメータ スニッフィングのように聞こえます。

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/ http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-パラメータ-スニッフィング.aspx

記事はそれを非常によく説明していますが、一言で言えば、エンジンは渡されたパラメーターに基づいてクエリを最適化することについていくつかの仮定を行うため、最適なパフォーマンスよりも遅くなります.

于 2013-10-28T13:59:13.413 に答える
0

SQL Management Studio での初回実行時にクエリに時間がかかり、その後は時間がかからない理由は、クエリが実行されるとデータが SQL サーバー キャッシュに格納されるためです。そして、同じクエリが再度実行されると、キャッシュからデータがフェッチされます。

クエリにかかった正確な時間を確認するには、クエリを実行する前にキャッシュをクリアする必要があります。

DBCC FREEPROCCACHE

DBCC ドロップクリーンバッファ

于 2013-10-30T08:14:50.010 に答える