[推荐] 【SQL Server2005页面存储4之--非聚集索引行在叶级别存储】 100feixianxxx]

发布时间:2017-5-23 5:26:02 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[推荐] 【SQL Server2005页面存储4之--非聚集索引行在叶级别存储】 100feixianxxx]",主要涉及到[推荐] 【SQL Server2005页面存储4之--非聚集索引行在叶级别存储】 100feixianxxx]方面的内容,对于[推荐] 【SQL Server2005页面存储4之--非聚集索引行在叶级别存储】 100feixianxxx]感兴趣的同学可以参考一下。

全文参看博文地址:http://blog.csdn.net/feixianxxx/archive/2010/05/08/5569945.aspx 非聚集索引行在叶级别存储的时候也分在堆上、在聚集索引的表上. 一:堆上的非聚集索引在叶级别的存储 /*---------------------------------------------------------------------- *auther:Poofly *date:2010.3.14 *VERSION: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)  Jul  9 2008 14:43:34  Copyright (c) 1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: ) *转载请注明出处 *更多精彩内容,请进http://blog.csdn.net/feixianxxx ------------------------------------------------------------------------*/ --建表(表源技术内幕) CREATE TABLE NC_Heap_Nodupes (   id int NOT NULL ,   str1 char (5) NOT NULL ,   str2 char (600) NULL );  GO --在str1上建立非聚集索引 CREATE UNIQUE INDEX idxNC_heap ON NC_Heap_Nodupes (str1);  GO --插入数据 DECLARE @i int; SET @i = 1240; WHILE @i < 1300 BEGIN   INSERT INTO NC_Heap_Nodupes     SELECT @i, cast(@i AS char), cast(@i AS char);   SET @i = @i + 1;  END;  GO --执行DBCC将结果插入表并显示相关页号 TRUNCATE TABLE sp_table_pages; INSERT INTO sp_table_pages     EXEC ('dbcc ind ( poofly, NC_Heap_Nodupes, -1)'  ); SELECT PageFID, PagePID, IndexID, IndexLevel, PageType  FROM sp_table_pages WHERE IndexLevel >= 0; /* PageFID PagePID     IndexID IndexLevel PageType ------- ----------- ------- ---------- -------- 5       52          0       0          1           --pagetype 1 数据分页2索引分页 5       54          2       0          2           --IndexID 0为堆 1为聚集索引2-250为非聚集索引     5       952         0       0          1 5       953         0       0          1 5       954         0       0          1 5       955         0       0          1 5       956         0       0          1 */ go 我们从结果可以看到由于数据行的量比较少只有行 所以我们只需要一个索引页来存储. IndexID为 PageType为 说明它是一个存储非聚集索引的索引分页,IndexLevel为 说明是叶级别的 --来看看这个页面的存储特点: dbcc traceon(3604); dbcc page(poofly,5,54,1) /* Slot 0, Offset 0x60, Length 14, DumpStyle BYTE 00000000:   06313234 30203400 00000500 0000††††††.1240 4.......            Slot 1, Offset 0x6e, Length 14, DumpStyle BYTE 00000000:   06313234 31203400 00000500 0100††††††.1241 4.......       .... Slot 59, Offset 0x39a, Length 14, DumpStyle BYTE 00000000:   06313239 3920bc03 00000500 0400††††††.1299 ........            */ --先来看第一条索引行Slot 0 06->状态位A(没有状态位B在索引行中) 313234 3020->=='1240 ' 它是一个非聚集值 3400 0000->Ox0034=52 这个书签的分页指针指向的页号 52 0500->书签的文件ID 0000->书签的槽号(行号,从开始) --第二条和第一条的区别 313234 3120->=='1241 ' 3400 00000500 0100->这个字节其实就是一个完整的书签 我们发现这个和上面记录的区别就是最后的书签的槽号(行号)不同,因为是条记录嘛 --最后一条索引记录 313239 3920->=='1299 ' 我们发现它的值就是我们表内的最后一条记录的非聚集值 bc03 0000->Ox03bc==956 我们可以看这个页号,这个存储我们表内最后一条记录的页号不就是么?     0500->文件号  0400->说明我们的这条记录在页里面是第五条记录   --我们来验证下上面的假设 dbcc page(poofly,5,956,1) /* Slot 4, Offset 0xa00, Length 616, DumpStyle BYTE  ... 00000000:   10006502 13050000 31323939 20313239 †.e.....1299 129          00000010:   39202020 20202020 20202020 20202020 †                         00000020:   20202020 20202020 20202020 20202020 † 、。。。。。 00000250:   20202020 20202020 20202020 20202020 †                         00000260:   20202020 20030000 †8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†             */ 我们拿出第四条来看看我们的str1值的大小吧? 注意看第个字节-第字节 3132303920=='1299 ',而它对应的行数 正是第五行 Slot 4 验证完毕,确实就如索引行记录的那样,利用书签,可以精确地找到我们的值在数据页的位置。 结论: 这里需要注意的是索引行的不包含状态位B.书签中的行号是从开始的. 非聚集索引在叶级别的索引行是存储了了它的非聚集键值和一个书签(指向包含非聚集值数据页的一个指针) 二:在含聚集索引的表上非聚集索引在叶级别的存储 这里也分种情况:一种是非聚集索引不包含聚集索引列,还有一种是非聚集索引列中包含了聚集索引列 --先来看第一种非聚集索引不包含聚集索引列 --建表(表源技术内幕系列) CREATE TABLE NC_Nodupes (   id int NOT NULL ,   str1 char (5) NOT NULL ,   str2 varchar (10) NULL  );  GO --在str2上建立唯一聚集索引,在str1上建立唯一非聚集索引 CREATE UNIQUE CLUSTERED INDEX idxcl_str2 on NC_Nodupes (str2); CREATE UNIQUE INDEX idxNC ON NC_Nodupes (str1);  GO --插入数据 DECLARE @i int; SET @i = 1240; WHILE @i < 1300 BEGIN   INSERT INTO NC_Nodupes     SELECT @i, cast(@i AS char),         cast(cast(@i * rand() AS int) as char);   --打乱了str1的排序   SET @i = @i + 1;  END;  GO --检查页面分布 TRUNCATE TABLE sp_table_pages; INSERT INTO sp_table_pages     EXEC ('dbcc ind (poofly, NC_Nodupes, -1)'); SELECT PageFID, PagePID, IndexID, IndexLevel, PageType  FROM sp_table_pages WHERE IndexLevel >= 0; /* PageFID PagePID     IndexID IndexLevel PageType ------- ----------- ------- ---------- -------- 5       957         1       0          1            --聚集索引对应的页面就是数据分页 5       959         2       0          2            --非聚集索引对应的页面是索引分页 */ go dbcc traceon(3604); --我们先来看下非聚集索引在聚集索引表上的存储 DBCC PAGE('POOFLY',5,959,1) /* Slot 0, Offset 0x60, Length 23, DumpStyle BYTE 00000000:   36313234 30200200 00010017 00313531 †1240 .......151          00000010:   20202020 202020†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?    Slot 1, Offset 0x77, Length 23, DumpStyle BYTE 00000000:   36313234 31200200 00010017 00313930 †1241 .......190          00000010:   20202020 202020†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?        .... Slot 57, Offset 0x57f, Length 23, DumpStyle BYTE 00000000:   36313239 39200200 00010017 00363533 †1299 .......653          00000010:   20202020 202020†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?†8224 ?    */ --先来看第一条索引行 36->状态位A:00110110 1-3位=3表示索引记录,第位表示存在NULL位图 第五位表示存在变长列 313234 3020->'1240 ' 0200->表的字段数目 2行 00->00000000NULL位图 最后四位为表示记录没有一个COL为NULL 0100->00000001 =1 变长列的数目 17 00->00000000 00010111=16+7=23 表示第一列变长列的结束位置因为只有一列变长列  所以也就是列长了 313531 20202020 202020->=='151       '这里的这个值是聚集值str2 --再来看看聚集索引键是非聚集索引键的一部分 CREATE TABLE NC_Overlap (   id int NOT NULL ,   str1 char (5) NOT NULL ,   str2 char (10) NULL  );  GO --注意这里的非聚集索引中包含了聚集索引列str2 CREATE UNIQUE CLUSTERED INDEX idxCL_overlap ON NC_Overlap (str2); CREATE UNIQUE INDEX idxNC_overlap ON NC_Overlap (str1, str2);  GO --用上面同样的方法插入数据后,查看PAGE /* PageFID PagePID     IndexID IndexLevel PageType ------- ----------- ------- ---------- -------- 5       963         1       0          1 5       965         2       0          2 */ go DBCC PAGE('POOFLY',5,965,1) /* Slot 0, Offset 0x60, Length 19, DumpStyle BYTE 00000000:   16313234 30203337 32202020 20202020 †.1240 372                 00000010:   020000†††††††††††††††††††††††††††††††...    。。                                    */ 结论: 我们可以看到它的索引页面分布和上面的情况其实几乎一样,唯一的区别就在于STR2的使用 在上面的页面中,由于STR2只作为聚集索引,所以在索引行中仅仅起到一个书签的作用 在这个情况的页面中,STR2不仅作为书签,还因为它本身是非聚集索引的原因而作为键值存储在上面, 虽然起了个作用,但是它只作为键值出现在行中(因为后面还有),并没有重复出现.但是还是起到了书签作用.

很久不写 。。。

顶顶..

挤挤。。

该回复于2010-07-28 09:05:50被版主删除

顶 ...

使劲顶.

学习..

顶的人有几个看呢?

我是飘过的

千斤顶

鼎一个

顶yi ge 谢谢楼主

呵呵, 我最近感觉  小F 和楼主两个人热情不是很高。尤其是小F就跟换了个人似的。 以前发帖那么积极。 现在不行了。  

引用 14 楼 andkylee 的回复:呵呵, 我最近感觉 小F 和楼主两个人热情不是很高。尤其是小F就跟换了个人似的。 以前发帖那么积极。 现在不行了。 两个人都为情多困中,真所谓XX也难过没人关呀!

该回复于2010-05-09 22:59:42被版主删除

真想仔细研究数据库

谢谢楼主,顶啊

好贴。

学习学习!顶一个!

真是好东西 感谢LZ!!

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

高深!

学习了   不错 好东西

吨位很高哦。。

学习下.......

顶,学习一下

不懂,来凑热闹

我想拿点积分怎么这么难呢

Net程序员一般不会太重视算法问题,因为工作中很少有机会用到,相比之下需求分析和构架设计的能力更为重要。反过来讲,算法能力也不能完全代表编程水平,更不能代表解决实际问题的能力。 但相信只要有程序员的地方,就会有人对算法感兴趣,即使在.Net版,也会有不少乐于思考某些不切实际问题的同志。 附一些实际工作中绝不会遇到的问题,大家可以测试一下自己对于这类问题的应对能力。 入门 1、一个长为10万的数组A,给出100万对下标i和j,其中i为起始下标,j为结束下标,j >= i,计算A[i]+A[i + 1] + ..... A[j](将这100万次计算结果存在数组) 2、共有40级台阶,每一步可以上1级,也可以上2级,问上这40级台阶共有多少种不同的走法 3、写段程序计算两个自然数A和B的最小公倍数

很好很强大!!

引用 31 楼 fengyuxiaole 的回复:很好很强大!! 一般

回帖有分

学习一下啊

该回复于2010-05-10 14:53:52被版主删除

mark

有项目开发管理经验的.NET的朋友加上限500人的QQ群28720769一起交流。

很强很厉害、。、

不错学习了

学习中...

飘过~~

ddddddddddddd

好好好好好好好好好好好好好好

haotie

UP..

[img=http://hi.csdn.net/space-164570-do-album-picid-472146.html][/img]

学习了,

LZ,多谢了。好东西

learning

学习学习,顶一下.

学习............

该回复于2010-05-10 15:04:20被版主删除

學習下

看了内容这论坛不错 收藏了

做个记号

做个记号

神了,再试试

顶一下,网站很好n

路过!!!

路过的

路过的看看

路过的看看

路过的看看

好东西!!!楼主强人!!!跟你学习了!!!

学习一下

路过,帮顶一下。

牛逼,顶一下!

牛逼,顶一下!

顶顶顶。。。。。。。。。

千斤顶~!

楼主支持你,你的数据库很棒的,向你学习.

厉害,不明白!

关注,之前一直不明

迟到了...

就是为了弄点分...

看看···········

谢谢楼主,鼎一个

路过 顶.....

听课还能接分,这样的好老师打着灯笼难找啊。

good good study

不错,很不错,真的不错。

恩,得好好学哈

dddddddddddddd

收藏了

太高深.看不懂

很有用的,谢了

很有用的,谢了

好贴   赞一个、、、、

na 分

上一篇:如何在SQL 中去特殊空格字符 40sena163]
下一篇:【MSSQL2008--SMO错误】 100feixianxxx]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

腹肌贴健身器材智能腹部训练健腹器肌