首页 > 解决方案 > 执行计划建议在不属于 where 子句的列上添加索引

问题描述

我在 SSMS 和执行计划中运行以下查询,建议在不属于 where 子句的列上添加索引。我计划在 where 子句(OID 和 TransactionDate)中使用的两列上添加索引。

SELECT  
        [OID] , //this is not a PK. Primary key column is not a part of sql script
        [CustomerNum] ,
        [Amount] ,
        [TransactionDate] ,
        [CreatedDate] 

FROM    [dbo].[Transaction]
WHERE   OID = 489
        AND TransactionDate > '01/01/2018 06:13:06.46';

索引建议

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Transaction] ([OID],[TransactionDate])
INCLUDE ([CustomerNum],[Amount],[CreatedDate])

更新

我需要包括其他列吗?正在使用 .net 中的 SQLBulkCopy 类通过后端进程将数据导入该表。我想知道所有列上的非聚集索引是否会降低性能。(在我的表中是名为 TransactionID 的 Pk 列,它是不需要的,但我在表中有这个以防将来需要它,否则 SQLBulkCopy 与堆一起工作得更好。其他选项是在 SQLBulkCopy 操作之前和之后删除并重新创建索引)

在此处输入图像描述

标签: sql-serverindexingsql-server-2008-r2sql-execution-plannon-clustered-index

解决方案


关键字指定要添加到非聚集索引的叶级别的INCLUDE非键列。

这意味着,如果您将添加此索引并再次运行查询,SQL Server 可以从索引中获取所需的所有信息,从而也无需在表中执行查找。

作为一般经验法则 - 当 SSMS 建议索引时,创建它。如果它没有帮助,您可以稍后放弃它。


推荐阅读