sql-server - 执行计划建议在不属于 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 操作之前和之后删除并重新创建索引)
解决方案
关键字指定要添加到非聚集索引的叶级别的INCLUDE
非键列。
这意味着,如果您将添加此索引并再次运行查询,SQL Server 可以从索引中获取所需的所有信息,从而也无需在表中执行查找。
作为一般经验法则 - 当 SSMS 建议索引时,创建它。如果它没有帮助,您可以稍后放弃它。
推荐阅读
- three.js - Threejs - 如何更改对象的旋转中心?
- jquery - 在jquery中通过某个类(数组)获取所有元素时添加一个动态数字id
- ios - 是否可以使用 ObjectMapper 创建 JSON?
- webpack - Webpack 4 --> configuration[0] 有一个未知的属性“优化”
- ansible - 无法从 ansible 安装 kubelet
- spring - 如何配置支持会话的 MongoDB 集群?
- javascript - 需要在 javascript 中显示来自 db 的数据
- c++ - 从 QFileSystemModel 中的文件路径和文件名获取 QModelIndex
- c++ - 将类的特定实例中的函数分配给变量以保持状态
- batch-file - 使用批处理文件打开单独文件夹中的每个文件