我在 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
有一个黄色图标,其中也有一个我无法修复的警告。我不知道这是否是索引没有被应用的原因。
假设您的索引名称指示相关列,则您有三个非聚集索引
运行查询时,您将基于 3 列查找行
由于没有覆盖所有三列的单个索引(聚集索引除外),因此查询需要使用至少 2 个索引,然后匹配结果,才能使用这些索引获得答案。
如果您将索引
IX_UserAssignedBranch_BranchID_AppUserID
更改为还包含列 AgentID
,则应使用该索引。