【问题标题】:SQL Server composite unique key performanceSQL Server 复合唯一键性能
【发布时间】:2020-04-16 22:09:50
【问题描述】:

我有 6 列我想在其中应用复合唯一键以防止重复,这在性能方面是否安全?

考虑我们将对这 6 个复合键的行为执行 CRUD。

【问题讨论】:

  • SQL Server 没有“唯一键”的概念 - 您不需要创建主键来强制唯一性:这就是 UNIQUE INDEX 的用途。跨度>
  • 就性能而言,这取决于您正在执行的操作、主机服务器的规格、数据规模(数百万、数十亿行?)以及您的实际索引创建。
  • 最大数据更新为 100k,但该表可能有 1000 万条记录
  • 首先,您需要将您的数据库拆分为 OLAP(用于单独的分析处理)或 OLTP(用于批量事务)。如果您想使用一个键,该键可以根据您提到的多个键来唯一标识行,您需要使用 SK(代理键)来唯一标识每一行。
  • @Dai SQL Server doesn't have a concept of a "unique key" - dba.stackexchange.com/q/144/5203

标签: sql sql-server performance sql-server-2012 database-performance


【解决方案1】:

6 列的复合唯一键

这取决于实际的例子。首先想到的是这个表是如何规范化或非规范化的?

它还取决于每个列的数据类型,以及每个组合的填充方式。

这将是一个非常广泛的索引。索引成本会增加。

会有非常高的索引碎片。

所以不仅 CRUD 的成本会增加,Select 查询也会受到影响。

由于索引成本高,优化器往往会选择索引扫描。

但是,如果您在 INT Identity 列上创建 Clsutered index

这将提高您的 CRUD 性能。

然后首先创建具有最选择性列的Composite Unique keys。 换句话说,复合索引中的列顺序很重要。

【讨论】:

    【解决方案2】:

    如果你问的是一个六列的索引是否“安全”,那很好。如果您的数据模型希望六列的组合是唯一的,那么唯一索引或唯一约束(使用唯一索引实现)就是强制执行的方式。

    索引有开销——无论是一列还是六列。一般来说,成本足够低,不会成为问题。而且数据完整性和更快的查询所带来的收益超过了成本。

    请注意,any 索引的键的总体大小是有限制的。如果您的数据值超过该大小,那么您将无法维护索引。

    【讨论】:

    • 尽管它是通过索引实现的,但正确地说,这是关于向数据库模型添加唯一的约束
    • 感谢您的解释,如果一天内没有其他答案,我会将您的答案视为已接受。
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2013-08-11
    相关资源
    最近更新 更多