【问题标题】:SQL Server Performance SuggestionSQL Server 性能建议
【发布时间】:2012-02-06 00:28:49
【问题描述】:

我一直在仅使用数据类型 int 的主键创建数据库表,我的性能一直很好,但需要使用可更新订阅者设置合并复制。

这些表使用典型的主键、数据类型 int 和标识增量。设置合并复制,我必须将 rowguid 添加到所有表,并使用 newsequentialid() 函数作为默认值。我注意到 rowguid 具有可索引性并且想知道我是否需要主键?

是否可以有 2 个索引,主键 int 和 rowguid?合并复制表的最佳布局是什么?我是否保留 int id 以便于行引用并仅删除索引但保留主键?不知道走哪条路,谢谢。

【问题讨论】:

    标签: sql-server sql-server-2008 replication merge-replication


    【解决方案1】:

    请记住,如果您删除 int id 列并将其替换为 GUID,您可能需要重新处理大量数据和查询。你真的想做这样的查询吗:

    select * from orders where customer_id = '2053995D-4EFE-41C0-8A04-00009890024A'  
    

    请记住,如果您的 id 暴露给任何用户(通常是客户的情况,因为客户表通常没有自然键,因为名称不是唯一的),他们会发现 guid 进行研究令人生畏。

    在现有系统中两者兼有并没有错。在新系统中,您可以计划不使用 int,但如果您尝试在已使用它们的系统中删除它们,则存在引入错误的巨大风险。

    【讨论】:

    • 非常感谢您的帮助。我正在考虑重新开始,因为我不想要任何未来的问题,所以只使用 rowguid 和可接受的设计?我应该将 rowguid 设置为主键吗?最后,该列是否必须命名为 rowguid 才能进行复制,或者我可以将其命名为 user_id?再次感谢您的帮助。
    【解决方案2】:

    用 guid(我知道)替换整数主键的唯一缺点是 GUID 更大,所以 btree(使用的索引空间)会更大,如果你有这个表的外键(你'也需要改变)更多的空间最终可能会被(可能)许多表使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多