SQLServer唯一索引和非唯一索引的区别简析.docVIP

SQLServer唯一索引和非唯一索引的区别简析.doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQL Server唯一索引和非唯一索引的区别简析 SQL Server创建索引时,可以指定Unique使之成为唯一索引。“唯一”顾名思义,但是两都到底有什么区别呢?因为索引也是一种物理结构,所以还是要从存储和结构上分析。 索引结构分叶级和非叶级,分析时我们要分开来看,这个很重要。 文中涉及的索引行大小计算,参考MSDN估计数据库大小索引部分。 1. 非唯一聚集索引和唯一聚集索引 ? 创建两个测试表,各10000条整数,tb1唯一,tb2非唯一,有1000条为9999的重复值。 Code create table tb1 (col1 int); declare @i int=1 while @i10001 begin insert into tb1 values(@i); set @i=@i+1; end; create unique clustered index ucix on tb1 (col1) go create table tb2 (col2 int); declare @i int=1 while @i9001 begin insert into tb2 values(@i); set @i=@i+1; end; go insert into tb2 values(9999) go 1000; create clustered index cix on tb2 (col2) go 先查询索引的一些基本状况: 从上面的结果可以看到,无论是叶级还是非叶级,非唯一聚集索引的索引行都比唯一的大一些,所以所占页也多一点。当然,因为测试数据很小,又是int,所以不明显。 ? 那到底大在哪里呢?将两者的非叶级页和叶级页放在一起比一下就知道了。先找出页号,再用DBCC PAGE来查看。 通过Paul S. Randal写的存储过程sp_allocationMetadata可以查到根页和每级索引的首页。 ? 就挑这两个页做对比。 发现多出一个UNIQUIFIER,同样叶级也是一样。MSDN说明: “如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。” 还有UNIQUIFIER不是一个全局自增列,重复记录增加时此值会发生改变,并且它是一个可为null的变长列。 现在来算一算索引行大小: ? ?两个表都是只有一个int型可为NULL的字段,而聚集索引叶级是存储数据本身 ?? 叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,再加上4字节的行头开销:两个表的叶级minSize =4+0+3+4=11 ?? 非叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,加上1字节的行头开销,再加6字节的子页指针:两个表的非叶级minSize=4+0+3+1+6=14 ?? tb1的索引行大小是一致的minSize=maxSize,因为它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因为:a)不唯一 b)UNIQUIFIER ?? 唯一标识列增加了2+1*2+4=8字节开销,tb2的min和max相差就是这8字节。 ?? tb2的叶级maxSize=4+8+3+4=19 ?? tb2的非叶级maxSize=4+8+3+1+6=22 小结:非唯一聚集索引为保证索引键值唯一性,会生成UNIQUIFIER与键列一起组成索引键值。同时无论在叶级还是非叶页级,都比唯一索引占用更多存储空间。 ? 2.堆表上的唯一和非唯一的非聚集索引 Code create table IndexTest (id int identity, UniqueCol int, NonuniqueCol int) go set nocount on; declare @i int=1; while @i100000 begin insert into IndexTest values(@i,@i); set @i=@i+1; end set nocount off; go create unique index UIX_UniqueCol on IndexTest (UniqueCol); create index IX_NonuniqueCol on IndexTest (NonuniqueCol); go select i.name,ips.index_id,ips.index_type_desc,index_depth,index_level,page_count,record_count, min_record_size_in_bytes as minSi

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档