私の実行計画はPasteThePlan.comに投稿されています。 2番目のネストされたループは警告です 結合述語がありません。私はまだこれに慣れていないので混乱しています。これは、CTEを使用して2つの属性の値を決定しているためですか?このプレゼンテーションテーブルは、いくつかのレポートで使用されています。この非常にユニークなレポート用に2つ目のレポートを作成したくありません。
これがクエリです:
WITH Accumulators AS
(
SELECT DISTINCT AreaNum, SuperintendentNum, SuperName
FROM FI.SLAnalysis
WHERE SuperName LIKE '%ACCUM%'
)
SELECT
slard.[IO]
, slard.PhaseName AS PhaseName
, slard.JobNum AS JobNum
-- , slard.JobName AS JobName
, CASE
WHEN SUBSTRING(JobNum, 5, 2) IN ('05', '06')
THEN ac.SuperintendentNum
ELSE slard.SuperNum
END AS SuperNum
, CASE
WHEN SUBSTRING(JobNum, 5, 2) IN ('05', '06')
THEN ac.SuperName
ELSE slard.SuperName
END AS SuperName
, slard.AreaNum AS AreaNum
, slard.AreaName AS AreaName
, fp.WeekEndDate AS WeekEndDate
-- WTD Metrics
, slard.WeeklyRevenue AS WTDRevenue
, slard.WeeklyCost AS WTDCost
, slard.WeeklyRevenue - slard.WeeklyCost AS WTDGP
, CASE
WHEN slard.WeeklyRevenue = .01 THEN 0
ELSE slard.WeeklyRevenue
END AS WTDRatio
, slard.Weekly_PER AS WTDGPPer
, slard.WeeklyStandOvrheadAdmin AS WTDOverAdmin
, slard.WeeklyStandOvrheadEquip AS WTDOverEquip
, (slard.WeeklyRevenue
-slard.WeeklyCost
-slard.WeeklyStandOvrheadAdmin
-slard.WeeklyStandOvrheadEquip) AS WTDOHGP
--MTD Metrics
, slard.MTDRevenue AS MTDRevenue
, slard.MTDCost AS MTDCost
, slard.MTDRevenue - MTDCost AS MTD_GP
, CASE
WHEN slard.MTDRevenue <= .05 AND slard.MTDRevenue > 0 THEN 0
ELSE slard.MTDRevenue
END AS MTDRatio
, CASE
WHEN slard.MTDRevenue <> 0
THEN CAST(slard.MTDCost / slard.MTDRevenue AS DECIMAL(18, 2))
ELSE CAST(0.00 AS DECIMAL(18, 2))
END AS MTDGPPer
, slard.MonthlyStandOvrheadAdmin AS MTDOverAdmin
, slard.MonthlyStandOvrheadEquip AS MTDOverEquip
, (slard.MTDRevenue
-slard.MTDCost
-slard.MonthlyStandOvrheadAdmin
-slard.MonthlyStandOvrheadEquip) AS MTDOHGP
-- YTD Metrics
, slard.YTDRevenue AS YTDRevenue
, slard.YTDCost AS YTDCost
, slard.YTDRevenue - YTDCost AS YTD_GP
, CASE
WHEN slard.YTDRevenue <= .53 AND slard.YTDRevenue > 0 THEN 0
ELSE slard.YTDRevenue
END AS YTDRatio
, slard.YTDStandOvrheadAdmin AS YTDOverAdmin
, slard.YTDStandOvrheadEquip AS YTDOverEquip
, (slard.YTDRevenue
-slard.YTDCost
-slard.YTDStandOvrheadAdmin
-slard.YTDStandOvrheadEquip) AS YTDOHGP
FROM [DW].[FI].[SLAnalysisReportData] slard
INNER JOIN Accumulators ac
ON slard.AreaNum = ac.AreaNum
INNER JOIN CORP.FiscalPeriod fp
ON slard.FY = fp.FY
AND slard.[Period] = fp.[Period]
WHERE slard.FY = 2018
AND slard.[Period] = 3
AND slard.AreaNum IN ('40')
AND NOT ( WeeklyRevenue = 0
AND WeeklyCost = 0
AND WeeklyStandOvrheadAdmin = 0
AND WeeklyStandOvrheadEquip = 0
AND MTDRevenue = 0
AND MTDCost = 0
AND MonthlyStandOvrheadAdmin = 0
AND MonthlyStandOvrheadEquip = 0
AND YTDRevenue = 0
AND YTDCost = 0
AND YTDStandOvrheadAdmin = 0
AND YTDStandOvrheadEquip = 0
)
述語slard.AreaNum IN ('40')
が入れ子ループ結合操作の両端にプッシュされるため、ここで発生します。
私 ブログ投稿があります これと同じことですが、結局のところ、WHERE句がJOIN句と一致するということですON slard.AreaNum = ac.AreaNum
これらの場合、オプティマイザはSARGable述語をインデックスアクセス(シークまたはスキャン)にプッシュできます。これは、出てくる値が一致することが保証されるためです。
これは暗黙の述語と呼ばれ、ここで詳細を読むことができます:
この場合の警告は無視できます。
お役に立てれば!