ここから本文です

SQL Serverにて、SQLの結果取得に時間がかかります。10分以上かかります。 SQL...

sat********さん

2010/6/1416:02:32

SQL Serverにて、SQLの結果取得に時間がかかります。10分以上かかります。

SQL文に問題があるかと思いますが、同じ結果を得るのに、
もっと、結果を早くするにはどうしたよいかどなたか、ご教授願いします。

---SQL文ここから----
SELECT
SUM(CASE [TM_スタート区分].[CS区分] WHEN 0 THEN ISNULL([TR_伝票].[金額], 0) ELSE 0 END) AS [金額]
FROM [TR_基本項目]
LEFT OUTER JOIN [TR_伝票]
ON [TR_基本項目].[営業日] = [TR_伝票].[営業日]
LEFT OUTER JOIN [TR_来場]
ON [TR_伝票].[営業日] = [TR_来場].[営業日]
AND [TR_伝票].[会計No] = [TR_来場].[会計No]
LEFT OUTER JOIN [TM_スタート区分]
ON [TR_来場].[スタート区分] = [TM_スタート区分].[スタート区分CD]
LEFT OUTER JOIN [TM_自社コース]
ON [TR_来場].[スタートコースCD] = [TM_自社コース].[自社コースCD]
LEFT OUTER JOIN [TM_クラブコース]
ON [TM_自社コース].[クラブコースCD] = [TM_クラブコース].[クラブコースCD]
LEFT OUTER JOIN [TM_料金]
ON [TR_来場].[料金CD] = [TM_料金].[料金CD]
WHERE (([TR_伝票].[SETCD] <> 'S') OR ([TR_伝票].[SETCD] IS NULL))
AND [TR_基本項目].[営業日] >= '2010/05/01'
AND [TR_基本項目].[営業日] <= '2010/05/31'
AND [TR_基本項目].[料金区分] = 1
AND [TM_クラブコース].[クラブハウスCD] = '01'
AND (
[TR_伝票].[科目CD] >= '001'
AND [TR_伝票].[科目CD] <= '350'
)
AND (
[TM_料金].[資格区分CD] >= '0'
AND [TM_料金].[資格区分CD] <= '2'
OR [TM_料金].[資格区分CD] >= '4'
AND [TM_料金].[資格区分CD] <= '4'
)
----ここまで----
各テーブルのキーは以下のとおりです。

【TR_基本項目】
営業日

【TR_来場】
営業日、会計No

【TR_伝票】
伝票No、明細No、営業日


よろしくお願いします。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
972
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

gar********さん

2010/6/1513:52:37

極めて一般的なアドバイスになってしまいますが。。

・絞り込みの効果が大きいもの、インデックスが使われるものを先に条件に書く
TR_基本項目.営業日のインデックスが使われていない可能性があります。

・余計なレコードまで抽出していないか考える
条件に[TM_クラブコース].[クラブハウスCD] = '01'とあります。
つまり[TM_クラブコース]には必ず対象レコードがなければなりません。
当然[TM_自社コース]、[TR_来場]にも対象レコードがなければなりません。
ならばこの3テーブルはINNER JOINでいいはずです。

同じように金額が欲しいのは[TM_スタート区分].[CS区分]=0のときだけですよね。
ならば[TM_スタート区分]もINNER JOINでいいはずです。

・最後の条件が分かりにくい
ANDとORが両方使われているのに、括弧がないので分かりにくいです。
[TM_料金].[資格区分CD] IN ('0','1','2','4')
と同じに見えます。

・[TR_伝票]、[TR_来場]を営業日のみでJOINしているということは[TR_来場]の主キーは[営業日]と
いうことですよね。
それならば、[TR_基本項目]とJOINした方がよいです。
[TR_伝票]は最も件数が多いように見えますが、のクラスタインデックスは使われないので、
許されるならば、[営業日]にも別にインデックスを張ることを検討してください。

・SSMSを使っておられるならば、上に「推定実行プランの表示」というのがありますので、
それも活用してみてください。

質問した人からのコメント

2010/6/15 15:28:04

降参 LEFT OUTER JOIN を INNER JOIN に変えると、15分かかっていた結果取得が2~3秒に短縮できました。ありがとうございました。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる