不要用把无序GUID既作为主键又作为聚集索引
2012-04-18 15:02
429 查看
我一直想当然的认为用GUID做主键没什么大不了,不就是比int多了12位而已吗?而且现在都是SQL Server 2008, 2012时代了,应该更不是问题了吧?而且微软很多项目也是用GUID做主键啊?Sharepoint, ASP.NET SQL Server Membership Provider默认的表等等。而且还有许多而且......
果真这样吗?直到我读了这两篇文章后GUIDs as PRIMARY KEYs and/or the clustering key 和 THAT'S NOT THE POINT!!!,结论令我很吃惊,甚至是“震撼”。
确切的讲,这种糟糕的结果不仅仅是使用GUID作为主键的原因,更主要的,我们通常在把它作为主键的同时还把它作为聚集索引。因为SQL Server默认就是这样的,我们总是接受默认的。注:这里我们是针对随机无序的GUID,如SQL Server的NEWID(), 客户端生成的如.NET的 Guid.NewGuid()。如果是顺序的GUID,如SQL Server NEWSEQUENTIALID()方法生成的,则不会有聚集索引的问题(但长度带来的问题依然存在)。事实是谁会用顺序的GUID呢?我今天才知道有这个方法。
总结两篇文章作者的结论,无序GUID作为主键以及作为聚集索引所带来的问题包括:
空间的浪费以及由此带来的读写效率的下降。
更主要的,存储的碎片化(fragmentation)以及由此带来的读写效率严重下降。
所以,尽量避免用GUID(无序或有序)做主键,不要用无序GUID做聚集索引。
我很好奇难道微软的开发人员也会犯这么低级的错误吗?我打开了ASP.NET SQL Server Membership Provider默认的表查看了一下,发现这些表虽然主键是GUID,但聚集索引不是默认的主键,如aspnet_Applications聚集索引是LoweredApplicationName字段,aspnet_Users聚集索引是ApplicationId和LoweredUserName连个字段。
果真这样吗?直到我读了这两篇文章后GUIDs as PRIMARY KEYs and/or the clustering key 和 THAT'S NOT THE POINT!!!,结论令我很吃惊,甚至是“震撼”。
确切的讲,这种糟糕的结果不仅仅是使用GUID作为主键的原因,更主要的,我们通常在把它作为主键的同时还把它作为聚集索引。因为SQL Server默认就是这样的,我们总是接受默认的。注:这里我们是针对随机无序的GUID,如SQL Server的NEWID(), 客户端生成的如.NET的 Guid.NewGuid()。如果是顺序的GUID,如SQL Server NEWSEQUENTIALID()方法生成的,则不会有聚集索引的问题(但长度带来的问题依然存在)。事实是谁会用顺序的GUID呢?我今天才知道有这个方法。
总结两篇文章作者的结论,无序GUID作为主键以及作为聚集索引所带来的问题包括:
空间的浪费以及由此带来的读写效率的下降。
更主要的,存储的碎片化(fragmentation)以及由此带来的读写效率严重下降。
所以,尽量避免用GUID(无序或有序)做主键,不要用无序GUID做聚集索引。
我很好奇难道微软的开发人员也会犯这么低级的错误吗?我打开了ASP.NET SQL Server Membership Provider默认的表查看了一下,发现这些表虽然主键是GUID,但聚集索引不是默认的主键,如aspnet_Applications聚集索引是LoweredApplicationName字段,aspnet_Users聚集索引是ApplicationId和LoweredUserName连个字段。
相关文章推荐
- 不要用把无序GUID既作为主键又作为聚集索引【转】
- [O]SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现
- 使用NEWSEQUENTIALID解决GUID聚集索引问题 SQLServer数据表主键的另一个方案
- SQL中自增量字段Int型 identity(1,1)与Guid作为主键的性能比较
- SQL Server中的联合主键、聚集索引、非聚集索引
- 使用NEWSEQUENTIALID解决GUID聚集索引问题
- mysql in(...) 1次取出当前记录及上1条下1条记录, 且使用了主键作为索引
- 主键与聚集索引
- SQL Server2000主键、唯一索引和聚集索引联系与区别
- 使用NEWSEQUENTIALID解决GUID聚集索引问题
- SQL Server里的主键、唯一性约束、聚集索引
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析
- 主键,唯一索引 聚集索引的关系
- 主键和聚集索引,单列索引和多列索引
- sql中创建主键非聚集索引和聚集索引
- 唯一索引,主键索引,聚集索引
- SQL存储原理及聚集索引、非聚集索引、唯一索引、主键约束的关系
- SQL Server中的联合主键、聚集索引、非聚集索引
- 聚簇索引(聚集索引) 不可作用于GUID类型字段
- 图解SQL Server:聚集索引、唯一索引、主键