C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SQLパラメータを使用した場合、処理速度が遅いのですが


(過去ログ 65 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■37784 / inTopicNo.1)  SQLパラメータを使用した場合、処理速度が遅いのですが
  
□投稿者/ モカ (1回)-(2009/06/30(Tue) 12:36:33)

分類:[.NET 全般] 

SQLServer2005 + VB.NET2005 で開発しております。
約三百万件のレコードがあるマスタテーブルに対して、
(1)
    Dim strSql As String = "update TMX_ITEM"
    strSql = strSql & " set DEL_FLG = 1"
    strSql = strSql & " where SHOHIN_NO = '" & "12345" & "'"
    strSql = strSql & " and COLOR_CD = '" & "01" & "'"
    strSql = strSql & " and SIZE_CD = '" & "23" & "'"

    Dim cmd As New SqlCommand(strSql)
    Dim intCount As Integer = cmd.ExecuteNonQuery

と、SQLの文字列結合で実行すると、コンマ数秒で結果が返るのですが、

(2)
    Dim strSql As String = "update TMX_ITEM"
    strSql = strSql & " set DEL_FLG = 1"
    strSql = strSql & " where SHOHIN_NO = @SHOHIN_NO"
    strSql = strSql & " and COLOR_CD = @COLOR_CD"
    strSql = strSql & " and SIZE_CD = @SIZE_CD"

    Dim cmd As New SqlCommand(strSql)
    cmd.Parameters.AddWithValue("@SHOHIN_NO", "12345")
    cmd.Parameters.AddWithValue("@COLOR_CD", "01")
    cmd.Parameters.AddWithValue("@SIZE_CD", "23")
    Dim intCount As Integer = cmd.ExecuteNonQuery

と、SQLパラメータを使用すると、結果が返るのに5秒程度もかかります。
where句の条件項目がテーブルの主キーなのですが、
インデックスが使用されずにフルスキャンされている様です。

文字列結合はエスケープ処理やセキュリティの問題があるので、
SQLパラメータを使用する方向で開発すべきと思うのですが、
主キー指定で5秒もかかるようでは使い物になりません。

この様な処理速度の遅さは、SqlCommand.Parameters の仕様で致し方無い事なのか、
何かしらの対処方法が有る事なのか、情報をお持ちの方は御教え願います。

引用返信 編集キー/
■37787 / inTopicNo.2)  Re[1]: SQLパラメータを使用した場合、処理速度が遅いのですが
□投稿者/ やじゅ (1064回)-(2009/06/30(Tue) 12:55:22)
やじゅ さんの Web サイト
No37784 (モカ さん) に返信
> この様な処理速度の遅さは、SqlCommand.Parameters の仕様で致し方無い事なのか、
> 何かしらの対処方法が有る事なのか、情報をお持ちの方は御教え願います。
>

違うかも知れないけどね。
昔、Char型の場合、シングルクォーテーションを付ける付けないで、数値と文字型の暗黙変換するのか
速度が違ったんだよね。

なので、パラメータの型指定を指定してみたらどうでしょうか?
引用返信 編集キー/
■37955 / inTopicNo.3)  Re[2]: SQLパラメータを使用した場合、処理速度が遅いのですが
□投稿者/ モカ (2回)-(2009/07/03(Fri) 15:59:26)
No37787 (やじゅ さん) に返信
> なので、パラメータの型指定を指定してみたらどうでしょうか?

テーブル定義と同じ SqlDbType.VarChar を指定すると、(1)と同じ速度になりました。
型指定なしで文字値の場合、SqlDbType.NVarChar になる事は確認してましたので、
それで十分だと思っていましたが、全く違うのですね。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -