<SQLServer2005>実行プランと実行タイムアウト
とある検品システムを作成しているのですが、
「タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。」
というエラーメッセージが出て困っています。
環境:SQLServer2005 SP適用なし
検品システムの流れを簡単に示します。
添付図も参考にしてください。
(1)受注データを受注テーブルに取り込む。
(2)出荷できるであろう数量を出荷数量として受注データに反映。
(3)受注テーブルより商品ごとの出荷数量分、検品テーブルに検品データを作成する。
(4)倉庫で商品バーコードを読み込み、シーケンス番号の若い順から検品フラグを0→1にする。
(5)欠品商品ビューより欠品帳票を作成する。
問題は(5)の欠品商品ビューよりselectしてくる所で発生します。
納品日を条件に取ってくるのですが、大したデータ件数もない(受注テーブル1万件、検品テーブル4万件)のに、ある納品日を条件にした時のみ、実行タイムアウトとなってしまいます。
原因を色々調べたところ、対象の納品日条件の時のみ、実行プランが異なっているようです。かといって、上記の通りそれほどデータ件数はないのですが,なぜそんなに時間がかかるのか…。
欠品情報を取得してくるselect文は
『select * from 欠品商品ビュー where 納品日 = '09/01/19'』
パラメータが違うだけで、実行プランはキャッシュされ、再利用されると思っているのですが、どうして異なるのでしょうか?
『dbcc freeproccache』でキャッシュを削除しても、また異なる実行プランが作成されます。
データのばらつき等関係あるのでしょうか?
また、現状応急処置としてCommandTimeoutの設定を長くすることで対応しましたが、CommandTimeoutの設定を長くしたことによって、一般的に問題となるようなことはあるのでしょうか?
長文で申し訳ありません。
どんな些細なことでもかまいません。
何かお気づきになることがありましたら、教えてください。
よろしくお願いいたします。
<欠品商品ビューの構成文>
select
T1.商品,
T1.受注数量,
(T1.受注数量 - T2.検品数量) as 欠品数量
from 受注テーブル as T1,(
select 商品, isnull(sum(検品フラグ),0) as 検品数量
from 検品テーブル
group by 商品
) as T2
where T1.商品 = T2.商品
and T1.受注数量 > T2.検品数量
union all
select
T1.商品,
T1.受注数量,
T1.受注数量 as 欠品数量
from 受注テーブル as T1
where T1.出荷数量 = 0
お礼
じゃあ略してる訳じゃないんですねぇ(^-^) わかりました! どうも有難うございました♪