我试图理解为什么非聚集索引在过滤时不适用于给定的查询。我的(大)查询的相关部分是这样的:
) results
JOIN BE_Insurance ins
ON results.PayorId = ins.Id
Run Code Online (Sandbox Code Playgroud)
在选择中,我只抓取 ins.name。我最初创建的索引是这样的:
CREATE INDEX IX_BE_Insurance_PayorId_PayorName
ON BE_Insurance (Id) INCLUDE (Name)
WHERE ParentId IS NULL
Run Code Online (Sandbox Code Playgroud)
我的查询是这样的,只有带有 NULL parentId 的 payorIds 才会被选择,但我理解优化器不愿意选择它。但是当我添加一个提示来尝试强制索引时,整个事情就出错了。
由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。
我认为它会遵循我的提示,如果我发现一些错误的数据并且索引缺少一些所需的值,则可能会在执行时出错。从索引中删除过滤器会导致查询成功选择它(即使没有提示)。
带有 WHERE 子句的索引不适合这样的查询吗?只有当优化器可以保证过滤器有效并且不会产生任何缺失值时,它们才符合条件吗?
根据要求,这是整个查询,仍在进行中。
SELECT results.*
FROM (
SELECT auths.*,
worked.WorkedHours,
worked.WorkedUnits,
worked.WorkedAmount,
worked.ActiveClients
FROM (
SELECT PayorId,
SUM(AuthHours) AuthHours,
SUM(AuthUnits) AuthUnits,
SUM(AuthAmount) AuthAmount
FROM (
--DYNAMIC TEMPLATE ----------------------------------------------------------------------------------
SELECT PayorId,
PayorName,
AuthHours AuthHours,
AuthUnits AuthUnits,
AuthAmount AuthAmount
FROM PayorAuthorizations_Level1Data_Authorizations auths WITH(NOEXPAND)
WHERE …Run Code Online (Sandbox Code Playgroud) sql-server index-tuning sql-server-2012 nonclustered-index filtered-index