理解执行计划的问题

Car*_*eta 4 sql-server optimization execution-plan

我不熟悉 SQL Server 中的执行计划,我试图了解 SQL Server 执行某些操作的原因。查询是:

select P.PERSONID
from KSS_V_EMPLEADOS_PER_3_CERRADOS p, COMBHOMEACCT c, LABORACCT L, kss_carga_empl_centros k, CALENDAR ca
where p.PERSONID = c.EMPLOYEEID
and c.LABORACCTID = l.LABORACCTID
and k.empleado = p.PERSONNUM
and convert(date,ca.CALENDARDTM,103) between DBO.KSS_PrimerDiaMes(convert(DATE,@DFECHA, 103)) and DBO.KSS_UltimoDiaMes(convert (DATE,@DFECHA, 103))
and convert(date,ca.CALENDARDTM,103) between p.Inicio and p.Fin
and convert(date,ca.CALENDARDTM,103) between convert(date,c.EFFECTIVEDTM,103) and convert(date,c.EXPIRATIONDTM-1,103)
and convert(date,ca.CALENDARDTM,103) between k.FECHA_INI and k.FECHA_FIN
and l.LABORLEV4NM <> k.CENTRO
Run Code Online (Sandbox Code Playgroud)

表信息

  • KSS_V_EMPLEADOS_PER_3_CERRADOS是一个没有索引的视图,涉及一些表和函数。它有 12827 行

  • COMBHOMEACCT c 是一个有 16771 行的表

  • LABORACCT 是一个有 2460 行的表

  • kss_carga_empl_centros 是一个有 6594 行的表

  • Calendar 是一个有 146462 行的表(它只是一个每天有一行的列的表)

我能够理解大部分计划,但就在最后一个内部连接之前,它执行一个返回 830563 行的索引假脱机,我不知道它为什么要执行这个索引假脱机并且找不到这个数字的来源。我能够毫无问题地计算所有其他行数,但是树的这个分支计算当月的天数并将其传递给索引假脱机操作符。但是这个运算符在做什么,为什么它返回 830563 行?

我已经上传了计划,以防万一有人想看:

https://www.brentozar.com/pastetheplan/?id=BkbEnkDNX

如果您需要更多详细信息,请询问我

提前致谢

查询的 SQL 计划

Eri*_*ing 5

急切索引假脱机被多次访问,每次获取大约 4 行。

坚果

它由 Row Count Spool 调用(注意重新绑定的次数与执行次数匹配):

坚果

在 Sort 运算符之后由 Nested Loops Join 迭代调用:

坚果

如果我没有提到使用多语句表值函数和动态转换日期(一些带有日期数学)通常会对查询产生负面性能影响,我将成为一个糟糕的顾问。我知道这不是你的问题,但是嘿。

如果您想了解有关线轴(以及许多其他运算符)的更多信息,Fabiano Amorim 有一系列出色的文章:

本周运营商 – 线轴,Eager 线轴

希望这可以帮助。