1

私は cmd.Parameters.AddWithValue を使用しており、クエリを実行するために DBType (int、varchar、...) を指定していません。SQL プロファイラーを調べたところ、このメソッドで実行されたクエリは、データ型を指定した場合よりもはるかに遅くなるようです。

どれほど遅いかを示すために、例を示します。クエリは 1 つのテーブルに対する単純な検索であり、where ステートメントの列にはインデックスが付けられます。データ型を指定すると、特定のクエリが約 0 MS (SQL サーバーで測定するには小さすぎる) で実行され、41 回の読み取りが必要になります。DBType を削除すると、約 200 ミリ秒かかり、クエリが完了するまでに 10000 回の読み取りが発生します。

SQLプロファイラーが値を誤って報告しているだけなのか、これらの値が実際に正しいのかはわかりませんが、DBTypeを追加および削除できるという点で再現可能であり、SQLプロファイラーで指定された値が生成されます.

他の誰かがこの問題に遭遇し、それを修正する簡単な方法がありますか. コード全体にデータ型を追加できることはわかっていますが、それは追加するものがたくさんあるように思えます。それを修正する簡単な方法があれば、それは大歓迎です。

[編集]

いくつかの初期テスト (両方のシナリオをループで実行) の後、プロファイラーが提供する値は正確であるように見えます。

追加情報として、Windows XP Pro で .Net 2.0 を実行し、DB 用に Windows 2000 で SQL Server 2000 を実行しています。

[アップデート]

掘り下げた後、関連する可能性のあるこのブログ投稿を見つけることができました。.Net の文字列値 (Unicode であるため) は、nvarchar パラメータとして自動的に作成されるようです。この問題を解決するために何かできるかどうかを確認するために、仕事に入る月曜日まで待つ必要があります。それでも、私が避けようとしていたデータ型を設定する必要があるようです。

この問題は、私が行ったすべてのクエリで発生するわけではなく、いくつかを選択しただけなので、問題のあるクエリで DBType を設定することに頼るかもしれませんが、問題に対するより一般的な解決策を探しています。

4

3 に答える 3

5

この問題は、SQLサーバーが暗黙的な型変換を行う方法に関連しています。NVARCHAR値(つまり、N'some text')を使用してVARCHAR列をフィルタリングする場合、NVARCHARを暗黙的にVARCHARに戻すことはできないため、SQLは列をNVARCHARに変換する以外に選択肢はありません。

最善の回避策は、タイプを指定するか、データベース列をNVARCHARに変更することです。

于 2008-12-06T15:50:58.973 に答える
2

この正確な問題に遭遇しました。多くの char 列を持つレガシー データベースがあります。列のタイプを指定しないと、クエリの 1 つで結果に数分かかりました。(デフォルトは nvarchar です。) 列の型を指定すると、結果に数秒かかることがありました。

cmd.Parameters.AddWithValue("charcolumn", "stringvalue");
cmd.Parameters[0].SqlDbType = SqlDbType.Char;

すべての文字列クエリを char 型にしてみて、どうなるか見てみようと思います。

[編集]

実際に...これを読んだ後: http://www.u2u.info/Blogs/U2U/Lists/Posts/Post.aspx?ID=11

私はこの解決策を採用することにしました:

cmd.Parameters.AddWithValue(colName, val);
if(val is string)
  cmd.Parameters[i].DbType = DbType.AnsiString;
于 2009-06-16T15:08:18.843 に答える
0

両方の場合に生成される SQL ステートメントは何ですか?

明示的に指定しないと、値が varchar と見なされると思われます。

例:SELECT OrderId FROM Orders WHERE OrderId = 1001
vsSELECT OrderId FROM Orders WHERE OrderId = '1001'

于 2008-12-05T22:37:01.480 に答える