在桌面上选择性能较慢

时间:2018-05-09 08:49:41

标签: sql sql-server performance

我正在使用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

有没有办法改善它?

2 个答案:

答案 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缺点

     
      
  1. 比传统的4字节索引值大4倍;如果这可能会产生严重的性能和存储影响   你不小心
  2.   
  3. 在userid ='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}'
  4. 的地方进行调试很麻烦   
  5. 为了获得最佳性能,生成的GUID应该是部分顺序的(例如,SQL 2005上的newsequentialid())并且能够使用   聚集索引
  6.   

与使用say int for Key相比,您的数据将分布在更多页面上并且将具有更多物理读取。

如果执行大量插入/更新/删除操作,则索引将高度分散。之所以如此,是因为GUID是随机生成的,并且需要引擎来更新索引以便按顺序组织它们。

我敢打赌你的索引需要重建。这是 an article ,它将GUID与INT列索引进行比较,并反映出GUID比INT慢,但可以改进并在索引重建时达到标准。

如果您认为GUID是罪魁祸首,我建议您应该bigint作为选项