SQL Server Profilerでsp_executesqlを表示するすべての挿入ステートメントについて


4

私たちのデータベースとクエリをチューニングして、QA環境でProfilerを開いて、その内容を確認しました。

私が呼び出すすべてのインサートに対して、挿入ステートメントのテキストでsp_executesqlが呼び出されました。

これは大ヒットに見えますが、これをオフにする方法はありますか?

環境:

  • SQL Server 2008 R2の標準
  • のWindows Server 2008 R2エンタープライズ
  • 32ギガバイトRAM
  • 2×4のXeon
9

私はあまり心配しないでしょう。

アイデアは再利用のためにステートメントをパラメータ化することです。つまり、コンパイルしないでください

3つの異なるクライアントが3つの別々のステートメントを実行しているとします。

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

これらはそれぞれ異なるテキストを持っているため、異なる計画にまとめられます。つまり、3つのコンパイルと3つの計画がキャッシュされています。

今、これら3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

ここで再利用可能なプランはステートメントSELECT col1, col2 FROM SomeTable WHERE col3 = @p0ためのものですので、 1つのプランはキャッシュです。

忙しいシステムでは、このコンパイル時間が重要です。そして、ほとんどのクエリはもちろんこれよりも複雑です。最初の実行とそれ以降の実行の時間でTesting Query Speedます( Testing Query Speed参照)。

また、複雑でビジー状態のシステムでは、キャッシュサイズを制限したり、データキャッシュ(バッファプール)からRAMを奪ったりすることもあります。極端な場合は、1万の計画、またはビジー状態のWebアプリケーションの計画です。(効果は32ビット対64ビットの微妙さによって異なります)

ORMやドライバによっては、これをオフにすることができます。通常は "準備済みステートメント"またはいくつかのオプションがあります。ただし、注意が必要です。あなたは「これは大ヒットのようです」と言っています。

+2

なぜ*いくつかのシステムがこれを行う理由についての素晴らしい説明。ストアドプロシージャを使用せずにSQLをパラメータ化できます。 15 9月. 112011-09-15 19:06:11


4

私は理解していません、あなたsp_executesqlの使用を停止したいですか?その場合は、このメソッドを使用しないようにコードを変更するだけです。私は、.NETのSQLCommandオブジェクトはsp_executsqlを利用すると考えています。したがって、.NETを使用している場合は、この呼び出しを期待する必要があります。


5

ほとんどのORM(Link2SQL、EFなど)を使用している場合、この素敵な小さな方法が使用されます。あなたがパラメータ化された挿入文を書くのであれば、この方法でもやります。

  0

私はパラメータ化された挿入を使用してこれを回避することはできませんか? ...まったく同じ? 15 9月. 112011-09-15 13:05:38

  0

あなたの唯一のオプションは、独自のストアドプロシージャを使用することです。 15 9月. 112011-09-15 17:19:53