为什么aspnet_regsql GUID生成主键?

dot*_*tex 6 asp.net-membership asp.net-roles

我正在Visual Studio 2010中开发一个ASP.NET网站(使用Service Pack 1,非常感谢).我想利用.NET的SQL Server 2008内置成员资格和角色提供程序.

现在,我已经开发了很长时间的Microsoft技术,并且已经在业务中使用了一些最好的SQL Server DBA.在构建数据库表时,他们每个人都告诉我远离 GUIDS作为主键:

  1. 拥有非常高的记录数.
  2. 有大量的插入和删除.

原因:因为主键是聚簇索引!

这基本上意味着插入表中的每个记录都必须遵守索引的约束.因此,如果索引按ASC排序,则具有新生成的GUID的记录必须以适当的顺序物理地嵌入到所讨论的数据表中.

这对于只有几千条记录的表来说就好了.SQL Server只需重新定位少数几个.但是,如果数据表具有数百万条记录,并且发现它必须在第216行插入新记录.可能需要花费大量时间(通过Web标准)才能完成.它必须将所有这些行向下移动,以插入新的行.

所以我的问题就是这个.由于微软以及我们所熟知和喜爱的所有DBS都对GUID作为主键说不...为什么ASPNET_REGSQL工具使用GUID作为主键创建表?

或者我错过了什么?2008年SQL Profiler引擎是否有新功能,不再将GUIDS视为任务?

Chr*_*fer 3

指南确实有一些优势;例如,如果您在应用程序代码中生成 guid,则可以在网络场中生成它们,而不必担心最终会获得相同的 ID。另一个好处是可以锁定数据库中的页面,而不会导致任何问题,因为同一数据页面中不太可能存在两个随机选择的行。

至于你所说的几百万行数据 - 只要你总是要求 SQL Server 返回一行数据,Guids 就可以了。最大的问题是当您请求某些较大的数据子集或批量插入大量行时;然后,您可能会执行大量随机 I/O 来获取符合您条件的所有行,或者将所有行插入到 guid 最终指向的随机位置。此外,SQL 不必“物理地将所有这些行向下移动以插入新行”;数据存储在页上,SQL 通常只需更改数据文件中一页上的数据即可插入行,可能还会更新其他几个页,但这与将行插入到大型文本文件中不同。

所有这些都说明了 - 是的,我通常也更喜欢使用整数作为主键,但只是想指出在某些情况下 guid 确实有意义。