小编Ada*_*kis的帖子

未选择过滤索引,并被提示拒绝

我试图理解为什么非聚集索引在过滤时不适用于给定的查询。我的(大)查询的相关部分是这样的:

) 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

5
推荐指数
1
解决办法
6019
查看次数