我的执行计划发布在 PasteThePlan.com 上。第二个嵌套循环警告没有连接谓词。我还是新手,所以我很困惑。那是因为我使用 CTE 来确定其中两个属性的值吗?此演示表用于更多的报告中,我不想为这个非常独特的报告创建第二个。
这是查询:
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 谓词推送到索引访问(查找或扫描),因为可以确保输出的任何值都会匹配。
这称为隐含谓词,您可以在此处阅读有关它们的更多信息:
克雷格·弗里德曼
一些博佐
在这种情况下,您可以忽略警告。
希望这可以帮助!