次のビューが定義されています。
dsplit_base - それぞれがファクト テーブルとマッピング テーブルの間の単純な結合である 4 つのクエリの結合 (呼び出し統計を含む); 201列で構成されています
calls_check - データの整合性チェックで使用するための dsplit_base から派生したビュー。定義は次のとおりです。
SELECT a.Brand,
a.[Call Center] ,
c.date,
c.weekday,
COUNT(*) vol,
cast((COUNT(*)-g.vol) AS real)/g.vol*100 vol_diff ,
SUM(abncalls+acdcalls) calls ,
CASE
WHEN g.calls<>0 THEN cast((SUM(abncalls+acdcalls)-g.calls) AS real)/g.calls*100
ELSE CASE
WHEN SUM(abncalls+acdcalls)<>0 THEN 100
ELSE 0
END
END calls_diff
FROM dsplit_base a
JOIN calendar c ON a.ROW_DATE=c.date
JOIN
( SELECT t.Brand,
t.[Call Center],
c.weekday,
avg(cast(vol AS bigint)) vol,
AVG(cast(calls AS bigint)) calls
FROM
( SELECT Brand,
[Call Center], row_date, COUNT(*) vol, SUM(abncalls+acdcalls) calls from dsplit_base group by ROW_DATE, [Call Center],
Brand ) t
JOIN calendar c ON t.row_date=c.date
GROUP BY c.weekday,
t.[Call Center],
t.Brand) g ON c.weekday=g.weekday
AND a.Brand=g.Brand
AND a.[Call Center]=g.[Call Center]
GROUP BY c.date,
c.weekday,
g.vol,
g.calls,
a.[Call Center],
a.Brand
次のクエリは、1 ~ 3 秒で約 16000 行を生成します。
select * from calls_check
Brand Call Center date weekday vol vol_diff calls calls_diff
LMN Munich 2008-01-24 Thursday 3 -25 470 8.796296
LMN Munich 2008-04-26 Saturday 3 0 352 51.72414
...
今私が遭遇した実際の問題は、限られた期間に結果を引き出そうとしたときです。次のようにwhere句を追加すると、クエリは終了しません(確かに〜10分ではありません):
select * from calls_check
where date >= DATEADD(d, -8, sysdatetime())
さらに奇妙なことに、このクエリは 1 秒で正常に実行されます。
select * from calls_check
where date < DATEADD(d, -8, sysdatetime())
where句の比較演算子がなぜこのような違いを生むのか、誰にもわかりますか? <が結果セットを非常に効率的にスライスするように見えるのに、 >または=がクエリを応答しないのはなぜですか?
いくつかの追加情報:
dsplit_base ビューは、4 つのテーブル ユニオン (結合あり) で構成されます。行数は次のとおりです。
dsplit_DE - 2521
dsplit_WNS - 7243
dsplit_US - 121451
パートナー - 377841 (166043)
実際の「パートナー」テーブルの行数は 166043 です。ビューでは、次の条件で行が取得されるためです。
from partners p join splitdim s
ON p.[Skill Name]=s.SPLITNAME and (p.Date>=s.[start_date] or s.[start_date] is null) and (p.DATE<=s.[end_date] or s.[end_date] is null)
where s.[Call center] IN ('Sitel', 'TRX', 'Sellbytel')
OR (s.[Call center]='WNS' and p.Date<(select MIN(row_Date) from dsplit_WNS))
OR (s.[Call Center]='Munich' and (p.Date<'2012-06-29' or p.Date between '2012-08-01' and '2012-08-27'))
ビュー定義を変更して実験したところ、次のことがわかりました。
dsplit_DE および/または dsplit_WNS のみのビューを持つ両方のクエリはかなり高速に動作します (1-2 秒)
パートナーの場合、'>=' クエリだけで ~30 秒かかりました。dsplit_US のみで、約 60 秒かかりました
これが後者のEXEC PLANの実際の実行計画です
最後の 2 つのテーブルは他のテーブルよりもはるかに大きいですが、数十万のレコードがあるため、それほど時間はかかりません。where句で使用される「<」または「>」演算子に依存する実行時間の違いの原因は何ですか?