【问题标题】:SQL Server : big data replication primary keySQL Server:大数据复制主键
【发布时间】:2019-10-07 17:19:19
【问题描述】:

我知道这个话题已经讨论过很多次了,但对此有不同的看法。我的场景是我创建了一个数据库,该数据库将填充 40 亿条记录,并且每年将添加 1 到 200 万条记录。

我们在美国和欧洲都有服务器,我们对数据库进行复制,以使它们在这些服务器上保持相似,例如 Facebook 对复制所做的事情。

我的问题是,我应该使用什么作为表的主键 - BigIntUniqueidentifier,或者我用于复制的内容没有任何区别?

  1. 是否应该创建一个非聚集的uniqueidentifier 主键,然后添加另一个聚集的bigInt 列?

或者

  1. 我应该创建一个聚集的bigint 主键吗?

【问题讨论】:

    标签: sql sql-server ssms database-replication sql-server-2017


    【解决方案1】:

    毫无疑问,请使用Uniqueidentifier

    不要添加bigint 列,你不需要它。

    如果您使用合并复制并且没有唯一标识符,那么服务器无论如何都会添加该列。

    通过使用 GUID,您现在可以设置多主数据库架构。如果你使用 bigint 作为身份字段,那么你要么强迫自己只使用一个主服务器(来控制 bigint),要么你必须想出一个方案来防止多个服务器相互冲突。此外,通过使用 GUID,您可以避免使用可猜测的 ID - 这通常是一件好事。

    我自己在数亿记录范围内进行的测试,每天在使用 GUID 与整数作为 id 时没有性能下降。

    最后一点 - 大多数地方 base64 在调用 web 服务时对 guid 进行编码,或者如果它要显示在任何地方 - 比如在地址栏中。

    【讨论】:

    • 但是您是否在 guid pk 上创建了集群索引?
    • 使用 GUID 作为集群主键会严重破坏您的性能 - 并且在此过程中也会浪费大量磁盘空间!您拥有的数据越多,情况就越糟糕。阅读 Disk space is cheap ..... 以及 Kimberly Tripp 的所有内容,以充分了解为什么会出现这种情况。顺便说一句:添加BIGINT 聚集索引实际上可能会为您节省大量磁盘空间! - 不要从一开始就忽略它!
    • @marc_s 那么您认为我应该使用带有聚集索引和 pk 的 bigint 还是带有非聚集索引的 guid 列,然后添加带有聚集索引的另一列 bigint。
    • @Whiplash :查看我的回复 - 如果可以选择,我会在 BIGINT IDENTITY 列上选择一个单一的集群键
    • @marc_s 如果我理解错误,请纠正我,因此您将选择创建一个 bigint 作为集群的数据类型主键,并且不创建 uniqueidentifier 列。使用 Bigint 不会导致复制数据复制出现问题吗?
    【解决方案2】:

    我只争辩另一种选择:我会尝试 避免 uniqueidentifier 列 - 绝对 作为您的集群键!

    集群键是 SQL Server 中重复次数最多的数据结构 - 如果您的集群键为 8,那么它确实会产生巨大的差异或 16 字节大小。更不用说 uniqueidentifier 集群键会引入的页面拆分数量 - 您可以使用 BIGINT 类型的集群键完全避免这种情况。

    如果你真的有兴趣 - 你必须阅读所有这些来自 Kimberly Tripp 的文章 - SQL Server 领域的“索引女王” - 这清楚地表明了一个多么糟糕和适得其反作为集群键的 GUID 可以是:

    【讨论】:

    • 我知道 guid 上的集群对性能和磁盘空间不利。因为我必须在数据库的欧盟服务器上进行复制复制,所以我应该使用 Guid 作为主键但使用 NON_CLUSTERED 索引,然后创建另一个数据类型为 bigint 的列并在该列上执行聚集索引。或者,如果我将 Bigint 创建为主键,因为集群索引会导致我无法进行复制
    • 如果你的表有 40 亿条记录,需要在其他服务器上进行复制数据复制,你会选择哪个选项?
    • @Whiplash:对不起,我不熟悉复制以及它可能有的任何要求,所以我不能在这里告诉你。从性能的角度来看,单个BIGINT 列作为PK+CK 是最好的;如果这不起作用,在我看来,将 GUID 用于非集群 PK,并在 BIGINT 上创建集群密钥
    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2017-12-20
    • 2023-03-25
    相关资源
    最近更新 更多