【发布时间】:2021-01-24 14:13:38
【问题描述】:
我想创建一个覆盖索引来提高查询性能。
我知道再增加一个索引会影响INSERT 的性能。
该表只有INSERT 操作没有UPDATE 或DELETE。覆盖索引中的数据将是唯一的,因为索引键包含表的PK,所以我不需要进一步限制唯一性,我的唯一目标是提高查询性能。
问题
哪种类型的索引可以优化(意味着降低)INSERT 的性能,唯一还是非唯一?
【问题讨论】:
-
“我知道再增加一个索引会影响 INSERT 性能。” - 根据我的经验,单个索引对
INSERT性能的影响可以忽略不计。有很多关于 1990 年代 DML 性能的非常陈旧(错误)的信息仍在网上传播。唯一确定的方法是进行自己的分析。另外,请注意诸如索引碎片之类的事情——最近的 RDBMS 构建在当今的商品硬件上运行维护良好的数据库,应该能够每秒处理数千字节大小的行上的数千个 DML 语句。 -
“哪种类型的索引将是最佳的(意味着降级更少)” - “降级”是什么意思?如果您指的是由插入引起的索引碎片,那么如果您没有进行 any 删除并且您的索引列(不是
INCLUDE列)单调增加,那么(理论上)应该t 是任何内部碎片或“降级”。 -
最好发布您的 实际 查询、
CREATE TABLE语句以及这些查询的执行计划(计划的屏幕截图即可) - 否则所有我们能做的就是推测。另外,您是在做单独的INSERT语句还是多行插入?您在运行事务时是否使用了任何锁(表锁、上锁、保持锁等)?等 -
一个不断增长的标识列会非常高效。如果您使用的是 SQL Server 2019,请使用
optimize_for_sequential_key = on提示 -
@Dai:你说得对,我应该提供准确的 CREAT 和 SELECT。关于降级,我的意思是:INSERT 操作的性能降级。该表有一个身份 PK 和一个用于 PK 的聚集索引
标签: sql-server indexing unique-key