在数据库设计中使用rowguid作为唯一键是一个好主意吗?

Ice*_*Ice 10 sql-server database-design data-modeling primary-key

SQL Server提供[rowguid]类型.我喜欢将其用作唯一主键,以标识要更新的行.如果您转储表并重新加载它,则会显示好处,而不会破坏SerialNo(标识)列.

在分布式数据库的特殊情况下,例如在笔记本电脑上的离线副本或类似的东西,没有其他工作.

你怎么看?开销太大了?

mar*_*c_s 18

作为逻辑意义上的主键(唯一标识您的行) - 是的,绝对是完全有道理的.

但是:在SQL Server中,主键默认情况下也是表上的聚类键,并且使用a ROWGUID作为聚类键是一个非常糟糕的主意.请参阅Kimberly Tripp的优秀GUID作为PRIMARY和/或群集密钥文章,深入了解为何不使用GUID进行群集.

由于GUID根据定义是随机的,因此您将拥有可怕的索引碎片,因此在插入,更新,删除和选择语句上的性能确实非常糟糕.

此外,由于群集密钥被添加到表上每个非聚集索引的每个字段,因此当使用16字节时,您在磁盘和服务器RAM上都浪费了大量空间GUID与4字节INT.

所以:是的,作为主键,ROWGUID有它的优点 - 但如果你使用它,绝对避免使用该列作为表中的聚类键!使用INT IDENTITY()或类似的东西.

对于群集密钥,理想情况下,您应该寻找四个功能:

  • 稳定(永不改变)
  • 独特
  • 尽可能小
  • 不断增加

INT IDENTITY()非常适合这种需要.是的 - 聚类键必须是唯一的,因为它用于物理定位表中的行 - 如果您选择的列不能保证是唯一的,SQL Server实际上会为您的聚类键添加一个四字节的唯一符号 - 再次,不是你想要的东西....

查看集群索引辩论的继续 - Kim Tripp("SQL Server索引的女王")的另一篇精彩而富有洞察力的文章,其中非常详尽地解释了所有这些要求.


Joe*_*orn 6

rowguid的问题在于,如果将它用于聚簇索引,最终会不断重新计算表格页面以进行记录插入.顺序guid(NEWSEQUENTIALID())通常效果更好.