执行计划建议在不属于 where 子句的列上添加索引

execution plan suggesting to add an index on columns which are not part of where clause

我正在 运行 跟踪 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 class 通过后端进程将数据导入 table。我想知道在所有列上使用非聚簇索引是否会降低性能。 (在我的 table 中,Pk 列称为 TransactionID,它不是必需的,但我在 table 中有这个,以防将来需要它,否则 SQLBulkCopy 可以更好地处理堆。其他选项是删除并重新创建索引SQLBulkCopy 操作前后)

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

这意味着如果您将添加此索引并运行再次查询,SQL服务器可以从索引中获取所需的所有信息,从而无需在table 还有。

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

您不需要在非聚集索引中添加所有 table 列,建议的索引适用于提供的查询。 SQL 服务器数据库引擎建议通常都很好。

需要 INCLUDE 关键字来避免 KEY LOOKUP 并使用 NONCLUSTERED INDEX SEEK。

总而言之:聚集索引扫描中没有 NONCLUSTERED INDEX 结果

创建的 NONCLUSTERED INDEX 没有包含列导致 NONCLUSTERED INDEX 扫描加键查找。

创建了包含列的 NONCLUSTERED INDEX 导致 NONCLUSTERED INDEX SEEK。