gpt4 book ai didi

sql - 使用 int 或 newsequentialid 作为聚簇表主键有哪些优点/缺点?

转载 作者:行者123 更新时间:2023-12-03 02:02:41 24 4
gpt4 key购买 nike

我有一个新应用程序,我想使用 GUID 作为聚簇表的主键。我听说使用 newid() 有缺点,所以我想了解有关 newsequentialid() 的更多信息。

具体来说,使用 int 比使用 newsequentialid() 生成的 guid 有什么优势。

最佳答案

GUID 似乎是主键的自然选择 - 如果您确实必须这样做,您可能会争论将其用作表的主键。我强烈建议不要这样做,即使用 GUID 列作为聚集键,这是 SQL Server 默认执行的操作,除非您特别指定告诉它不要这样做。

您确实需要分开两个问题:

  1. 主键是一个逻辑结构 - 唯一且可靠地标识表中每一行的候选键之一。这实际上可以是任何东西 - 一个 INT、一个 GUID、一个字符串 - 选择最适合您的场景的内容。

  2. 聚集键(定义表上“聚集索引”的一列或多列) - 这是与物理存储相关的事物,并且在这里,小型、稳定、不断增加的数据类型是您的最佳选择 - INTBIGINT 作为默认选项。

默认情况下,SQL Server 表上的主键也用作聚簇键 - 但不必如此!我个人看到,当将以前基于 GUID 的主/聚集键分解为两个单独的键时,性能得到了巨大的提升 - GUID 上的主(逻辑)键和 GUID 上的聚集(排序)键一个单独的 INT IDENTITY(1,1) 列。

Kimberly Tripp - 索引女王 - 和其他人已经说过很多次 - GUID 作为聚类键不是最佳的,因为由于其随机性,它将导致大量页面和索引碎片导致性能普遍较差。

是的,我知道 - SQL Server 2005 及更高版本中有 newsequentialid() - 但即使这样也不是真正完全顺序的,因此也会遇到与 GUID< 相同的问题 - 只是稍微不那么突出。

然后还有另一个问题需要考虑:表上的聚集键也将添加到表上每个非聚集索引的每个条目中 - 因此您确实希望确保它尽可能小。通常,具有超过 20 亿行的 INT 对于绝大多数表来说应该足够了 - 与作为集群键的 GUID 相比,您可以节省数百兆字节磁盘和服务器内存中的存储量。

快速计算 - 使用 INTGUID 作为主键和聚类键:

  • 具有 1'000'000 行的基表(3.8 MB 与 15.26 MB)
  • 6 个非聚集索引(22.89 MB 与 91.55 MB)

总计:25 MB 与 106 MB - 而且这只是在一个表上!

还有一些值得深思的东西 - Kimberly Tripp 写的很棒的东西 - 读它,再读它,消化它!这确实是 SQL Server 索引福音。

马克

关于sql - 使用 int 或 newsequentialid 作为聚簇表主键有哪些优点/缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29507777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com