1

約70個のパラメータを使用した更新クエリがときどきタイムアウトするという問題があります。いくつかの調査に基づくと、これはパケットスニッフィングによるものだと思います。新しいバージョンのSQLServerではこのOption(recompile)句を使用できますが、サーバー2000を使用しているため、私の場合は機能しません。

sqlhelper.executeNonQueryストアドプロシージャではなく、使用しています。

4

2 に答える 2

3

私の知る限り、 のような「すぐに使える」方法はありませんがOption(recompile)、オプティマイザをだます方法を見つけたのを覚えています。すべてではなく、実際に外部でクエリに渡しているパラメータのみを盗聴しているようです。したがって、実行しようとすると

SELECT MyField1, MyField2 FROM MyTable WHERE MyOtherField = @MyParm

パラメータのスニッフィングは発生しますが、次のように書くと

DECLARE @MyUnsniffableParm varchar(30)
SET @MyUnsinffableParm = @MyParm    
SELECT MyField1, MyField2 FROM MyTable WHERE MyOtherField = @MyUnsniffableParm

もちろん、スクリプトにパラメーターのみを渡し@MyParmます。パラメーターのスニッフィングは発生しないようです。教えてください 私の記憶が正しければ、試すべき SQL 2000 インスタンスがありません!
編集:
他の何かがここで同じことをしているように見えます: http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

于 2012-10-30T17:45:20.327 に答える
1

簡単な修正は、パラメーターを使用しないことです。それ以外の:

SELECT * FROM YourTable WHERE UserName = @myUserName;

合格:

SELECT * FROM YourTable WHERE UserName = 'PFranchise'

SQL Server がパラメータを認識していない場合、それらを盗聴することはできません! SQL Server は、クエリごとにクエリ プランを再コンパイルします。

このアプローチに関する 2 つの注意事項:

  • SQLインジェクションに注意
  • それ以降のバージョンの SQL Server では、サーバー オプションの "forced parameterization"を使用すると、パラメーターのないクエリでも傍受できます。デフォルトではオフになっています。ただし、SQL Server をアップグレードする際には注意が必要です。
于 2012-10-30T17:44:29.777 に答える