我正在以下查询中运行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操作之前和之后删除并重新创建索引)>
答案 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。