|
分類:[データベース全般]
お世話になります。
開発環境:
SQL Server 2000、VS2005、VB2005
SELECT
TargetDate.Ymd AS 対象日付
,ISNULL(SEGMENT.Kya,0) AS 客数
,ISNULL(SEGMENT.Sur,0) AS 売上数
,ISNULL(SEGMENT.Kgk,0) AS 売上額
,ISNULL(SEGMENT.Ara,0) AS 粗利額
,TOTAL.Kya AS 全体客数
FROM (A) AS TargetDate
LEFT OUTER JOIN (B) AS SEGMENT
ON TargetDate.Ymd = SEGMENT.Ymd
INNER JOIN (C) AS TOTAL
ON TargetDate.Ymd = TOTAL.Ymd
ORDER BY TargetDate.Ymd
上記クエリーにて(A)対象日付,(B)部分実績,(C)全体実績 の
3つのテーブルを結合して、日別売上実績を抽出しています。
それぞれを単体発行すると、
A:対象日付 3864887行(T明細) → 31行 1秒
B:部分実績 3864887行(T明細) → 31行 33秒
C:全体実績 3682行(T日報) → 31行 1秒
にて取得できるのですが、3つのテーブルを結合すると、何故か273秒もかかります。
取得件数が少ないので、それぞれクエリーを3回発行してプログラムで結合させれば、済む話なのですが、
1回のクエリで取得するとプログラムより遅くなる原因がわかりません。
個人的に気になるのが、結合するとA、B、Cそれぞれの実行プランが実行回数4になることです。
何か調査方法・解決方法などありましたら、よろしくお願い致します。
【Aのクエリー】
SELECT
TBL.Ymd as Ymd
FROM PosTranData AS TBL
WHERE 1=1
AND TBL.Ymd BETWEEN '20110701' AND '20110731'
GROUP BY
TBL.Ymd
【Bのクエリー】
SELECT
ReceSum.Ymd as Ymd
,SUM(ReceSum.Kya) as Kya
,SUM(ReceSum.Sur) as Sur
,SUM(ReceSum.Kgk) as Kgk
,SUM(ReceSum.Ara) as Ara
FROM
(
SELECT
TBL.Ymd as Ymd
,1 as Kya
,SUM(TBL.Sur) as Sur
,SUM(TBL.Kgk) as Kgk
,SUM(TBL.Kgk-TBL.Sur*TBL.GenTan) as Ara
FROM PosTranData AS TBL
LEFT OUTER JOIN 商品マスター AS SHO ON TBL.Jan=SHO.Jan
WHERE 1=1
AND TBL.Ymd BETWEEN '20110701' AND '20110731'
AND LEFT(SHO.Bun,2) = '01'
GROUP BY
TBL.Ymd
,TBL.Ten
,TBL.Pos
,TBL.Receipt
) AS ReceSum
GROUP BY ReceSum.Ymd
【Cのクエリー】
SELECT
TBL.Ymd as Ymd
,SUM(TBL.Kya) as Kya
,SUM(TBL.Sur) as Sur
,SUM(TBL.Kgk) as Kgk
,SUM(TBL.Ara) as Ara
FROM DailyReport AS TBL
WHERE 1=1
AND TBL.Ymd BETWEEN '20110701' AND '20110731'
GROUP BY TBL.Ymd
【SQLテーブル情報】
PosTranData(クラスタ化インデックス、一意):Ymd,Ten,Pos,Receipt,Gyo
DailyReport(クラスタ化インデックス、一意):Ymd,Ten
|