前提
C#でSQLServerを使用し、Windowsアプリケーションを作成しています。
取得したデータはCrystalReportで帳票表示します。
発生している問題・エラーメッセージ
とあるパラメーターをnullでない値にセットすると、
とても遅くなり、以下のタイムアウトエラーが発生します。
ーーーーーーー
System.Data.SqlClient.SqlException
HResult=0x80131904
Message=実行タイムアウトの期限が切れました。操作完了前にタイムアウト期間が過ぎたか、サーバーが応答していません。
Source=.Net SqlClient Data Provider
(場所省略)
内部例外 1:
Win32Exception: 待ち操作がタイムアウトになりました。
ーーーーーーー
以下に試したことなど記載いたしますが、あとは何を見ればよいのか・・・お手上げです。
何が原因と考えられるか、他に何を試すべきかご教授いただければ幸いです。
該当のソースコード
項目名など伏せないといけないものがあるため、すべて変更しました。
全文は文字数制限で載せられなかったので、回答欄に載せます。
載せられませんでした・・・
SQL
1SELECT 2 t.a group1 3 ,t.anm group1nm 4 ,ymb.b group2 5 ,ymb.bnm group2nm 6 ,CONVERT(int, CONCAT(ymb.yyyy, ymb.m)) group3 7 ,CONCAT(ymb.yyyy, '年', ymb.m, '月') komokunm 8 ,IsNull(c1.AA1, 0) AA1 9 ,IsNull(c1.AA2, 0) AA2 10 ,IsNull(c1.AA3, 0) AA3 11 ,IsNull(c1.AA4, 0) AA4 12 ,IsNull(c1.AA5, 0) AA5 13 ,IsNull(c1.AA6, 0) AA6 14 ,IsNull(c1.AA7, 0) AA7 15 ,IsNull(c1.BB1, 0) BB1 16 ,IsNull(c1.BB2, 0) BB2 17 ,IsNull(c1.BB3, 0) BB3 18 ,IsNull(c1.BB4, 0) BB4 19 ,IsNull(c1.BB5, 0) BB5 20 ,IsNull(c1.BB6, 0) BB6 21 ,IsNull(c1.BB7, 0) BB7 22 ,IsNull(c2.totalAA, 0) zAA 23 ,IsNull(c3.totalAA, 0) kAA 24 ,IsNull(s.AA, 0) AA 25 ,IsNull(m.MM, 0) MM 26 ,IsNull(n.NN1, 0) NN1 27 ,IsNull(n.NN2, 0) NN2 28 FROM 29 (SELECT DATEPART(yyyy, CONVERT(DATETIME, ym + '/01')) yyyy, DATEPART(m, CONVERT(DATETIME, ym + '/01')) m, b, bnm, a FROM W_YM ym, M_B b WHERE ym.flg5 = b.flg5) ymb 30LEFT JOIN 31 (SELECT 32 shorino 33 ,no 34 ,Gcd 35 ,ymd hiduke 36 ,CASE WHEN (CASE WHEN IsNull(shime, 0) = 0 THEN 1 ELSE shime END) <= 28 THEN (CASE WHEN DATEPART(d, ymd) > shime THEN DATEFROMPARTS(DATEPART(yyyy, DATEADD(m, 1, ymd)), DATEPART(m, DATEADD(m, 1, ymd)), (CASE WHEN IsNull(shime, 0) = 0 THEN 1 ELSE shime END)) ELSE DATEFROMPARTS(DATEPART(yyyy, ymd), DATEPART(m, ymd), (CASE WHEN IsNull(shime, 0) = 0 THEN 1 ELSE shime END)) END) ELSE DATEADD(d, -1, DATEFROMPARTS(DATEPART(yyyy, DATEADD(m, 1, ymd)), DATEPART(m, DATEADD(m, 1, ymd)), 1)) END ymd 37 ,Scd 38 ,Sjikan 39 ,kjikan 40 ,sjikan1 41 ,sjikan2 42 ,sjikanM 43 ,sjikanH 44 ,a 45 ,shime 46 FROM 47 T_N_H 48) h 49 ON 50 d.nippono = h.no 51LEFT JOIN 52 M_S s 53 ON 54 d.sagyoincd = s.sagyoincd 55LEFT JOIN 56 (SELECT 57 b 58 ,bnm 59 ,a 60 ,CASE WHEN @f= 1 THEN b ELSE IsNull(f_b, b) END f 61 ,pre_m 62 ,act_m 63 ,AA 64 ,kAA 65 ,NN2AA 66 ,kuAA 67 ,nyuAA 68 ,f_b 69 ,flg1 70 ,flg2 71 ,flg3 72 ,flg4 73 ,flg5 74 FROM 75 M_B 76) c 77 ON 78 h.Gcd = c.b 79LEFT JOIN 80 W_P_S p 81 ON 82 h.shime = p.shime 83 WHERE 84 h.ymd >= p.startymd 85 AND 86 h.ymd <= p.endymd 87 AND 88 (@tsujo = 1 OR (@tsujo = 2 AND c.flg1 = 1) OR (@tsujo = 3 AND c.flg1 = 0)) 89GROUP BY c.f, DATEPART(yyyy, h.ymd), DATEPART(m, h.ymd) 90) c1 91 ON 92 ymb.b = c1.f 93 AND 94 ymb.yyyy = c1.yyyy 95 AND 96 ymb.m = c1.m 97LEFT JOIN 98 M_ABC t 99 ON 100 t.a = ymb.a 101・・・省略・・・ 102 WHERE 103 (@a is null OR t.a = @a) 104 AND 105 (@b is null OR ymb.b = @b) 106 AND 107 (IsNull(c1.AA2,0) <> 0 OR IsNull(c1.BB2,0) <> 0 108 OR 109 IsNull(c1.AA3,0) <> 0 OR IsNull(c1.BB3,0) <> 0 110 OR 111 IsNull(c1.AA4,0) <> 0 OR IsNull(c1.BB4,0) <> 0 112 OR 113 IsNull(c1.AA5,0) <> 0 OR IsNull(c1.BB5,0) <> 0 114 OR 115 IsNull(c1.AA6,0) <> 0 OR IsNull(c1.BB6,0) <> 0 116 OR 117 IsNull(c1.AA7,0) <> 0 OR IsNull(c1.BB7,0) <> 0 118 OR 119 IsNull(c2.totalAA, 0) <> 0 OR IsNull(c3.totalAA, 0) <> 0 120 OR 121 IsNull(s.AA, 0) <> 0 OR IsNull(m.MM, 0) <> 0 122 OR 123 IsNull(n.NN1,0) <> 0 OR IsNull(n.NN2,0) <> 0)
この[@a]が[3]、[@b]が[null]のときに発生します。
([@a]が[null]や[@a]が[3]で[@b]が[100]のときは発生しません。長くても10秒ほどで帳票表示まで完了します。)
パラメーターは以下のように渡しています。
※実際はコンボボックスのValueを最終的にint型かDBNullで渡すメソッドを通してセットしていますが、以下の渡し方でも同じ現象が起こりました。
C#
1 using (SqlCommand cmd = new SqlCommand(strSQL, mCon)) 2 { 3 cmd.Parameters.AddWithValue("a", 3); 4 cmd.Parameters.AddWithValue("b", null); 5 cmd.Parameters.AddWithValue("f", 1); 6 cmd.Parameters.AddWithValue("tsujo", 1); 7 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) da.Fill(dt); ←エラー発生個所はここ 8 }
試したこと
タイムアウトの制限が原因かと思い、[CommandTimeout]を長く設定したのですが、
5分ほど待ちましたが処理が終わりませんでした。
こちら(https://baiteen.wordpress.com/2010/11/12/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8sqlserver%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%8C%E9%81%85%E3%81%84/)
を参考に、パラメーターの型をInt型に指定しましたが結果は変わりませんでした。
これに関連してSQL側で直接キャストを試みましたが変わりませんでした。
ーーーーーーーー
(@a is null OR t.a = @a)
↓
(@a is null OR t.a = cast(@a as int))
ーーーーーーーー
SSMSで同じSQLを動作させましたが、
パラメーターでの動かし方が良くわからず、
単なる置き換えですとすぐに結果は返ってきます。(2秒ほど)
該当のパラメータをスカラー変数で指定してみても、特に問題なくすぐ処理は終わりました。

回答1件
あなたの回答
tips
プレビュー