我正在使用SQL Server,我有一个像这样的表
CREATE TABLE dbo.CompanyRolesExpanded (
StaticId uniqueidentifier NOT NULL,
UserId uniqueidentifier NULL,
UserGroupId uniqueidentifier NULL,
CompanyId uniqueidentifier NULL,
CompanyGroupId uniqueidentifier NULL,
CompanyAccessUnitRole uniqueidentifier NULL,
PRIMARY KEY CLUSTERED (StaticId)
)
GO
目前,这张表约有3百万行。 像这样的简单选择需要大约30秒
SELECT UserId,UserGroupId
,CompanyId,CompanyGroupId
,CompanyAccessUnitRole
FROM CompanyRolesExpanded
有没有办法改善它?
答案 0 :(得分:3)
在这种情况下,从性能的角度来看,我不认为guids是帐篷中的长杆。从远程服务器选择3M行下面的PowerShell测试,结果显示int测试平均快了约10%。假设您的环境中有类似的结果,那么使用int会导致27秒,而使用guid会导致30秒。我观察到大部分时间是由于客户端CPU处理大的结果集。
这并不是说guids没有考虑因素,特别是在单磁盘旋转媒体存储上,但我想说清楚它的大结果集是问题而不是数据类型。
SELECT * FROM TABLETEST;
答案 1 :(得分:2)
虽然问题的完整上下文(如执行计划,索引)未知,但我很想将与GUID相关的相当大的垮台列表作为我的答案。
表中的所有列都有一个GUID。
StaticId uniqueidentifier NOT NULL,
UserId uniqueidentifier NULL,
UserGroupId uniqueidentifier NULL,
CompanyId uniqueidentifier NULL,
CompanyGroupId uniqueidentifier NULL,
CompanyAccessUnitRole uniqueidentifier NULL
引用source的缺点,作者赞成GUID
GUID缺点
- 比传统的4字节索引值大4倍;如果这可能会产生严重的性能和存储影响 你不小心
- 在userid ='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}'
的地方进行调试很麻烦- 为了获得最佳性能,生成的GUID应该是部分顺序的(例如,SQL 2005上的newsequentialid())并且能够使用 聚集索引
醇>
与使用say int for Key相比,您的数据将分布在更多页面上并且将具有更多物理读取。
如果执行大量插入/更新/删除操作,则索引将高度分散。之所以如此,是因为GUID是随机生成的,并且需要引擎来更新索引以便按顺序组织它们。
我敢打赌你的索引需要重建。这是 an article ,它将GUID与INT列索引进行比较,并反映出GUID比INT慢,但可以改进并在索引重建时达到标准。
如果您认为GUID是罪魁祸首,我建议您应该bigint
作为选项