【问题标题】:GUID PK + INT IDENTITY Clustered Index + Merge Replication + Foreign KeysGUID PK + INT IDENTITY 聚集索引 + 合并复制 + 外键
【发布时间】:2015-04-23 08:42:11
【问题描述】:

我有一个带有 GUID PK 的数据库,我了解添加 INT IDENTITY 列(例如 ClusterID)然后在其上创建聚集索引可以带来性能优势。

对于连接,使用ClusterID 列作为外键会带来性能优势。尤其是在父/子情况下,子表可以在父ClusterID 上具有聚集索引。

但是在合并复制方案中这是不可能的,因为 ClusterID 列不一定是唯一的。

所以我想知道在这种情况下如何最好地获得性能优势。

例如:

表A

  • ID guid(主键)
  • ClusterID int 标识(聚集索引)`

表B

  • ID guid(主键)
  • TableAID guid(TableA 的外键)
  • TableAclusterID int(聚集索引)`

我想我会使用触发器来使 TableAClusterID 保持最新状态。

然后一个查询如

select * 
from TableB B 
where B.TableAClusterID = @TableAClusterId

将受益于提高的性能。

这是怎么做到的?

【问题讨论】:

  • 您所说的性能优势是什么?插入性能?碎片化?
  • 为什么 ClusterID 在合并复制方案中不是唯一的?如果您使用自动身份范围管理,则可以保证 ID 是唯一的。
  • @Ben - 尽管sqlskills.com/blogs/kimberly/… 接近,但我找不到一篇总结它的文章,但从我所读到的内容来看,所有性能通常会通过聚集索引提高,即使列是'未使用数据。
  • @marc_s 可能更适合回答这个问题,因为他回答了很多关于此的问题。
  • 如果您不确定您所期望的确切好处,您如何知道您是否得到了它?我的建议是不要仅仅因为您在某处听到这是个好主意就这样做......对于插入性能,您真的只需要索引按插入顺序排列。身份可以做到这一点,但时间戳也是如此。同样,除非你确定你知道你期望获得什么,否则不要这样做。相反,请查看执行慢的查询的查询计划,并从中设计索引。

标签: sql-server


【解决方案1】:

对于非常重的 INSERTS GUID 将比INT IDENTITY 执行得更好,因为您不会对它产生争用。有一些技术可以修复它,但它仍然可能是一个问题。在所有其他情况下,INT/BIGINT 的表现要好得多。它们在非常大的范围内是独一无二的,并且尺寸比 GUID 小 2-4。如果您将这些额外的 12 个字节乘以使用 GUID 的行数,然后乘以基于您的聚集 GUID 索引构建的非聚集索引的数量,您将看到该垃圾使用的数据库大小的 %%。我假设,如果不是更多的话,你的表现也会下降同样的百分比。大小总是很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 2016-05-22
    • 2015-03-12
    • 1970-01-01
    • 2010-10-24
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多