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

时间:2018-10-29 10:52:17

标签: sql-server indexing sql-server-2008-r2 sql-execution-plan non-clustered-index

我正在以下查询中运行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类通过后端进程将数据导入到该表中。我想知道是否所有列上都没有群集索引会降低性能。 (在我的表中是不需要的Pk列,称为TransactionID,但我在表中有此字段,以防将来需要它,否则SQLBulkCopy可以更好地与堆配合使用。其他选择是在SQLBulkCopy操作之前和之后删除并重新创建索引)

enter image description here

2 个答案:

答案 0 :(得分:4)

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

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

作为一般经验法则-当SSMS建议索引时,创建它。如果无济于事,您可以稍后再删除它。

答案 1 :(得分:0)

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

INCLUDE关键字是避免键查找并使用NONCLUSTERED INDEX SEEK所必需的。

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

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

使用包含的列创建的NONCLUSTERED INDEX将导致NONCLUSTERED INDEX SEEK。