在SQL Server中使用顺序Guid作为主键是否会导致大数据的低性能?
我使用过的最大的数据库是SQL Server数据库,其中一个表包含200000行。我使用在SQL Server中使用顺序Guid作为主键是否会导致大数据的低性能?,sql,.net,database-performance,guid,sqlperformance,Sql,.net,Database Performance,Guid,Sqlperformance,我使用过的最大的数据库是SQL Server数据库,其中一个表包含200000行。我使用Guid作为数据库中的主键,而不是顺序Guid。我在该系统中没有遇到性能问题,该系统中有大约30个并发用户 最近,我设计并开发了一个企业应用程序开发框架。为了利用“工作单元”模式,我使用了一个顺序guid作为主键,以便对记录进行物理排序。由于我对大型数据库的经验仅限于我刚才提到的,我有一个严重的问题,如果我要使用这个框架为一个拥有1000个并发用户的大型组织开发一个企业应用程序,它将使用顺序guid作为主键保
Guid
作为数据库中的主键,而不是顺序Guid。我在该系统中没有遇到性能问题,该系统中有大约30个并发用户
最近,我设计并开发了一个企业应用程序开发框架。为了利用“工作单元”模式,我使用了一个顺序guid作为主键,以便对记录进行物理排序。由于我对大型数据库的经验仅限于我刚才提到的,我有一个严重的问题,如果我要使用这个框架为一个拥有1000个并发用户的大型组织开发一个企业应用程序,它将使用顺序guid作为主键保存数百万条数据记录,这会导致性能问题吗
如果是,到什么程度?如果是的话,可以通过改进数据库服务器硬件(处理器和RAM)来解决这个问题,然后再提高到什么程度
提前感谢您分享您的经验和知识
GUID
似乎是您主键的自然选择-如果您确实需要,您可能会争辩将其用作表的主键。我强烈建议不要使用GUID
列作为集群键,SQL Server默认情况下会这样做,除非您明确告诉它不要这样做
您确实需要将两个问题分开:
INT
,一个GUID
,一个字符串-选择对您的场景最有意义的内容INT
或BIGINT
,作为默认选项GUID
上的主键(逻辑)键和在单独的INT IDENTITY(1,1)
列上的聚集(排序)键
正如“索引女王”和其他人多次指出的那样,GUID
作为群集键不是最佳的,因为由于其随机性,它将导致大量页面和索引碎片,并导致总体性能不佳
是的,我知道-在SQL Server 2005和更高版本中有newsequentialid()
,但即使是这样也不是真正的完全顺序的,因此也会遇到与GUID
相同的问题-只是不太明显而已
然后还有另一个需要考虑的问题:表上的集群键也将添加到表中每个非集群索引的每个条目中——因此您确实希望确保它尽可能小。通常情况下,一个具有20多亿行的INT
对于绝大多数表来说应该足够了——与作为集群键的GUID
相比,您可以在磁盘和服务器内存中节省数百兆的存储空间
快速计算-使用INT
与GUID
作为主键和群集键:
- 包含1'000'000行的基表(3.8MB与15.26MB)
- 6个非聚集索引(22.89MB对91.55MB)
- GUID列是主索引或聚集索引(特别是索引中唯一的键)的一部分
- 您的数据库上有“很多”插入项
- 您的应用程序没有执行很多插入操作
- 您正在定期对表进行碎片整理
- 这张桌子太小了,这几乎无关紧要