【问题标题】:SQL Server unique vs not unique index INSERT performanceSQL Server 唯一与非唯一索引插入性能
【发布时间】:2021-01-24 14:13:38
【问题描述】:

我想创建一个覆盖索引来提高查询性能。 我知道再增加一个索引会影响INSERT 的性能。

该表只有INSERT 操作没有UPDATEDELETE。覆盖索引中的数据将是唯一的,因为索引键包含表的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


【解决方案1】:

哪种类型的索引将是最佳的(意味着降级更少)INSERT 性能,独特还是非独特?

差异可以忽略不计。

另一方面,可能会产生一些影响的是索引键长度。越小越好。您可以从索引键中删除主键并使索引非唯一。它将仍然是一个覆盖索引,因为所有非聚集索引在叶页节点上都有聚集索引键,假设您的主键是聚集的。

【讨论】:

    【解决方案2】:

    覆盖索引中的数据将是唯一的,因为索引键包含表的PK ... 哪种类型的索引将是最佳的唯一或不唯一的?

    假设你的表有一个聚集索引:

    在将聚集索引键添加为索引键列之后,SQL Server 中的非唯一非聚集索引物理上存储为唯一索引。

    因此,对于包含聚集索引键的非聚集索引,您是否声明索引是唯一的绝对没有区别。

    【讨论】:

    • "在将聚集索引键添加为索引键列之后,SQL Server 中的非唯一非聚集索引物理存储为唯一索引。" - 你能详细说明一下吗?
    【解决方案3】:

    这取决于您对“降级”的定义。如果您正在讨论在任何一种情况下为同一列建立索引,并且能够使用 UNIQUE 关键字,因为该列将始终包含一组唯一的值,那么为将来使用该索引的查询。

    您可以阅读在Brent Ozar's - Performance Benefits of Unique Indexes 中创建索引时能够使用UNIQUE 关键字带来的性能优势。

    针对您的 cmets,如果您将索引表示为 UNIQUE 与未指定该关键字,则 INSERT 性能将没有差异。

    【讨论】:

    • degrade:INSERT 操作的性能下降
    • @g.pickardou 请查看我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 2012-05-03
    • 2010-09-28
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多