【SQL SERVER2005页面存储3之--聚集索引的存储】

feixianxxx 2010-04-14 08:53:52
加精
发帖无法排版,详见博客http://blog.csdn.net/feixianxxx/archive/2010/04/14/5486513.aspx

一:聚集索引在叶级别的存储

聚集索引在叶级别的存储其实就是以数据页的形式存储的,之前几篇关于堆数据行的存储已经都详细说过了,但是这里因为有了聚集索引,
所以还是有个特殊的地方需要注意的--带有唯一标识符的聚集索引行.
我们如果在建表并为其建立聚集索引时,没有为它指定UNIQUE属性,那么系统在键值遇到重复的时候,会自动增加一个4字节的字段来保证聚集键值的唯一。
至于为什么要保证它聚集键值的唯一,那么因为非聚集索引在引用它作为书签的时候必须要征求唯一性来取到唯一行

/*----------------------------------------------------------------------
*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 Clustered_Dupes
(Col1 char(5) NOT NULL,
Col2 int NOT NULL,
Col3 char(3) NULL,
Col4 char(6) NOT NULL);
GO
--在col1上建不唯一的聚集索引
CREATE CLUSTERED INDEX Cl_dupes_col1 ON Clustered_Dupes(col1);
go
--插入数据
INSERT Clustered_Dupes VALUES ('ABCDE', 123, null, 'CCCC');
GO
--运行DBCC 查看各个类型页号
TRUNCATE TABLE sp_table_pages;
INSERT INTO sp_table_pages
EXEC ('dbcc ind ( tempdb, Clustered_Dupes, -1)' );
SELECT PageFID, PagePID FROM sp_table_pages
WHERE PageType = 1 and PrevPageFID = 0 and PrevPagePID = 0;
GO
dbcc traceon(3604);
--查看数据页情况
dbcc page (tempdb,1,151,1)
/*
00000000: 10001600 41424344 457b0000 00000000 †....ABCDE{......
00000010: 43434343 20200500 08†††††††††††††††††CCCC ... */
--这是插入一条记录后的行记录,跟一般数据行的记录并没有区别
go
--插入2条主键COL1重复的记录再次查看记录
INSERT Clustered_Dupes VALUES ('ABCDE', 456, null, 'DDDD');
INSERT Clustered_Dupes VALUES ('ABCDE', 64, null, 'EEEE');
go
--再次查看
dbcc page (tempdb,1,151,1)
/*
Slot 0, Offset 0x60, Length 25, DumpStyle BYTE

00000000: 10001600 41424344 457b0000 00000000 †....ABCDE{......
00000010: 43434343 20200500 08†††††††††††††††††CCCC ...

Slot 1, Offset 0x79, Length 33, DumpStyle BYTE

00000000: 30001600 41424344 45c80100 00000000 †0...ABCDE.......
00000010: 44444444 20200500 08010021 00010000 †DDDD .....!....
00000020: 00†††††††††††††††††††††††††††††††††††.

Slot 2, Offset 0x9a, Length 33, DumpStyle BYTE

00000000: 30001600 41424344 45400000 00000000 †0...ABCDE@......
00000010: 45454545 20200500 08010021 00020000 †EEEE .....!....
00000020: 00†††††††††††††††††††††††††††††††††††.
*/
--我们来看第二条和第三条 他们的都比第一条多了8个字节
第二条的最后面8个字节->>>>010021 00010000 00
第三条的最后面8个字节->>>>010021 00020000 00
分解下第二条:
0100->00000001=1 变成列的数目(原来的表中没有变长列,这列是唯一标识符认为是变长列的原因)
21 00->00100001=33 这列变长列字段结束的位移 即记录的长度
01000000->00000001=1唯一标识符的值为1
对应的我们看到第三条的唯一区别就是 最后的4个字节是02000000=2
小结论:通过每个记录多出来的8个字节 我们就能唯一标识每条记录了

--接下来我再插入几条看下情况
INSERT Clustered_Dupes VALUES ('ABCD', 456, null, 'DDDD');
INSERT Clustered_Dupes VALUES ('ABCD', 64, null, 'EEEE')
INSERT Clustered_Dupes VALUES ('ABCD', 6, null, 'EEEE')
--再次读PAGE 我们可以发现
--我们发现当新插入的三条跟上面一样,第二 三条是多出了8个字节,而且最后唯一标识符是从1 开始递增 ,并不是接着上面的2开始递增

结论:
当我们在建立聚集索引的时候没有指定唯一性,当聚集键出现重复值的时候,系统会自动为行增加一个4字节的边长列标识符。
...全文
990 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
落幕年代 2011-09-24
  • 打赏
  • 举报
回复
学习学习
f_8970753 2010-04-19
  • 打赏
  • 举报
回复
暂时用不到,学习学习..
Lucky_NUS_Wilson 2010-04-18
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧 呵呵
iguohao 2010-04-17
  • 打赏
  • 举报
回复
很好。。。。
doudoullihaijun 2010-04-17
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧 呵呵
godtoi 2010-04-16
  • 打赏
  • 举报
回复
好像要装.Net Framework 2.0
深度了解 2010-04-16
  • 打赏
  • 举报
回复
看不懂,收藏!
PCPCPC2012 2010-04-16
  • 打赏
  • 举报
回复
学习,好东东
doudoullihaijun 2010-04-16
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
feixianxxx 2010-04-16
  • 打赏
  • 举报
回复
走前一顶
mynameis_007 2010-04-16
  • 打赏
  • 举报
回复
xw1062833610 2010-04-16
  • 打赏
  • 举报
回复
加油!!!!!!!!!!
xiaoxiangqing 2010-04-16
  • 打赏
  • 举报
回复
说得不错,觉得内容有点深.
xiaoguizl 2010-04-16
  • 打赏
  • 举报
回复
呵呵,学习了
weike5188 2010-04-16
  • 打赏
  • 举报
回复
好东西大家用
lovebin_bin 2010-04-16
  • 打赏
  • 举报
回复
收藏了
hust88 2010-04-16
  • 打赏
  • 举报
回复
的发生的非
永生天地 2010-04-16
  • 打赏
  • 举报
回复
get
masky5310 2010-04-16
  • 打赏
  • 举报
回复
知识贴收藏
opensoftflow 2010-04-16
  • 打赏
  • 举报
回复
>..
加载更多回复(57)
SQL Server 2008高级程序设计 4/6 SQL Server 2008 2010 高级程序设计 作者:(美)维埃拉 著,杨华,腾灵灵 译 出版社:清华大学 出版日期:2010-4-1 ISBN:9787302222729 字数:1250000 页码:730 -------------------------------------------------------------------------------- 内容提要 -------------------------------------------------------------------------------- Microsoft SQL Server 2008极大地完善了数据库引擎的核心组件,也改变了数据库应用程序的构建方式。《SQL Server 2008高级程序设计》由世界顶尖SQL Server权威专家Robert Vieira编写,旨在指导您熟练运用一系列日趋复杂的功能,助您更高效地管理数据。   本书首先介绍SQL Server 2008的新功能,然后在更详实的示例代码的引导下全面深入地展开论述,讨论了如何编写复杂查询、构建各种数据结构以及提高应用程序性能,还讲述了如何管理高级脚本和数据库以及如何确定和改正脚本错误。   本书提供了快速创建和部署数据驱动的解决方案来满足业务需求的信息,介绍了新数据类型、索引结构、管理功能和高级时区处理等重要内容,掌握这些知识后,您将使自己的数据库发挥㈩最大功效。   主要内容   ◆除规范化外的数据设计技巧   ◆尽量提高应用程序运行速度的方法   ◆有关存储过程和用户定义函数的全部内容   ◆存储过程的高级处理方法   ◆报表服务和集成服务的用法   ◆提高数据库安全性的提示信息   ◆如何利用XML和XQuery支持   ◆通过修改特定数据值进行推理分析的步骤   读者对象   本书面向想要学用所有SQL Server 2008功能的有经验的开发人员。 目录 -------------------------------------------------------------------------------- 第1章 回顾SQL Server中的对象  1.1 数据库的构成  1.2 数据库对象概述  1.3 SQL Server数据类型  1.4 SQL Server对象标识符  1.5 小结 第2章 工具  2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 构建嵌套子查询  3.3 相关子查询  3.4 派生表  3.5 EXISTS运算符  3.6 INTERSECT和EXCEPT运算符  3.7 通用表表达式(CTE)  3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述  4.5 小结 第5章 细心推敲,大胆设计  5.1 进一步了解规范化  5.2 关系  5.3 图表  5.4 逻辑设计与物理设计  5.5 通过经典的BLOB处理基于文件的信息  5.6 子类别  5.7 数据库重用  5.8 反规范化  5.9 通过分区方法进行扩展  5.10 SQL Server关系图工具  5.11 关于日期列  5,12 小结 第6章 核心存储和索引结构  6.1 SQL Server存储  6.2 理解索引  6.3 创建、修改和删除索引  6.4 明智地决定何时何地使用何种索引  6.5 维护索引  6.6 小结 第7章 更高级的索引结构  7.1 XML索引  7.2 用户定义的数据类型  7.3 层次数据  7.4 空间数据  7.5 文件流  7.6 启用文件流  7.7表压缩  7.8 小结 第8章 视图  8.1 回顾视图语法  8.2 更复杂

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧