索引不适用于 SQL Server 存储过程

问题描述 投票:0回答:1

我在 SQL Server 中有一个表,如下所示。

并且,对于上表,我对以下列进行了索引,如下所示:

我有一个存储过程,它将逗号分隔的 Id 列表与该表进行比较,如果所有传入的 Id 都与该表匹配,则返回

true
,否则返回 false。存储过程如下:

ALTER PROCEDURE [dbo].[HasAccessToAllBranches]
    @userId    uniqueidentifier,
    @agentId   uniqueidentifier,
    @branchIds NVARCHAR(max)
AS
BEGIN
    WITH vals AS
    (
        SELECT value FROM string_split(@branchIds, N',')
    )
    SELECT CONVERT(BIT, CASE WHEN EXISTS
    (
        SELECT * FROM vals v
        WHERE NOT EXISTS 
        (
            SELECT *
            FROM [UserAssignedBranch] AS [u]
            WHERE [u].[AgentId] = @agentId AND
                  (v.value = [u].[BranchId] AND [u].[AppUserId] = @userId)
        )
    ) THEN 0 ELSE 1 END);
END

正如您所看到的,我有

WEHRE
AgentId
子句以及复合唯一索引
BranchId
AppUserId

但是当我执行存储过程时,我根本看不到索引被应用。下面是SSMS的实际执行计划

左侧最后一个

SELECT
有一个黄色图标,其中也有一个我无法修复的警告。我不知道这是否是索引没有被应用的原因。

sql sql-server stored-procedures
1个回答
0
投票

假设您的索引名称指示相关列,则您有三个非聚集索引

  • 代理ID
  • BranchID 和 AppUserID
  • 用户个人资料ID

运行查询时,您将基于 3 列查找行

  • [u].[代理 ID]
  • [u].[分支 ID]
  • [u].[AppUserId]

由于没有覆盖所有三列的单个索引(聚集索引除外),因此查询需要使用至少 2 个索引,然后匹配结果,才能使用这些索引获得答案。

如果您将索引

IX_UserAssignedBranch_BranchID_AppUserID
更改为还包含列
AgentID
,则应使用该索引。

© www.soinside.com 2019 - 2024. All rights reserved.