0

次のビューが定義されています。

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句で使用される「<」または「>」演算子に依存する実行時間の違いの原因は何ですか?

4

1 に答える 1