在繁忙的站点中,在SQL Server中使用NEWID()作为UserId的.NET MVC可能存在性能问题



让我们假设我们正在构建一个将被数百万人使用的高流量网站,并且我们使用了MVC默认项目附带的默认成员资格提供程序,其中包含所有的成员资格基础设施、角色和一切都很好。

但默认情况下,在数据库中创建的用户的主id是NEWID(),并且在项目中的任何地方都使用它。

假设我们谈论的是非常繁忙的站点,那么在使用NEWID()作为主键的情况下,是否存在任何性能问题?把所有东西都转换成INT值得我花时间吗?

正如您所知,[aspnet_Users]表上的聚集索引是在唯一用户名上创建的,而不是在用户ID(NEWID)上创建的。

谢谢!

如果在聚集索引前使用GUID,请考虑使用NEWSEQUENTIALID()而不是NEWID()。使用后者将导致聚集索引中的碎片,因为它以基本上随机的顺序生成GUID。

NEWID()仅在创建新行并插入新行和新ID时使用。之后,索引对网站的速度负责,这不会受到影响。

我对这个主题做了一些研究,并提供了以下文章:http://goo.gl/expzC

使用GUID作为用户ID时,有三个潜在的性能问题来源:

  1. 如果将它们用作聚集键或非聚集键,它们将导致用户表和/或索引碎片化。这增加了INSERTs和SELECTs所需的时间
  2. 创建GUID可能比查找下一个int或bigint花费更多的CPU周期
  3. GUID的大小为128位(16字节),这增加了行宽度(因此也增加了执行某些查询的时间),并且比int或bigint需要更多的时间来检索和比较

使用GUID的优点是:

  1. 您可以在web层上创建它们,而无需首先进行DB往返
  2. 它们很难猜测,从安全角度来看可能会有所帮助

出于这些原因,我已经编写了一个自定义的高性能成员资格提供程序,并且我仍然使用GUID。

最新更新