聚集表(clustered table)data page中的数据行可以无序
误区
一直以为只要一个表含有聚集索引,那么在data page中的数据行是排序的。比如原来data page中有1.2.4.5.6这样四条记录,那么我要插入3这条记录,应该是先将456三条记录往后移,然后再插入3这条记录。这样的理解是错误的。
正解
首先从上面的数据行插入说起,如果要移动后面的记录来插入中间的记录,这么会影响性能,这是不允许的。sql server肯定有其他办法来实现有序。今天读inside sql server 2005第七章的时候才明白,其实data page内的数据可以无序,但是可以通过data page中的OFFSET TABLE实现有序。
实验
我们需要创建一个测试表,并在一个字段上添加聚集索引,代码如下

use TESTDB;
--step1:创建测试表,有id和name 两列
create table t1
(
id int not null,
name char(10) not null
); --step2:在id字段上创建聚集索引
create clustered index idx_t1_id on t1(id); --然后插入一条记录
insert into t1 values(1,'zhangsan'); --通过dbcc page找出其数据存储方式
dbcc ind(TESTDB,T1,1);
dbcc traceon(3604);
dbcc page(TESTDB,1,118,1);

上面实验得到的结果如下所示:

DATA:
Slot 0, Offset 0x60, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000F82A060
0000000000000000: 10001200 01000000 7a68616e 6773616e †........zhangsan
0000000000000010: 20200300 00†††††††††††††††††††††††††† ...
OFFSET TABLE:
Row - Offset
0 (0x0) - 96 (0x60)

总结:
- 在data中,010000007a68616e 6773616e表示的就是(1,'zhangsan')。
- 在offset table中,我们看到第一个offset=96,这是因为header的长度就是96,offset的意思就是第一条记录距离data page起点的偏移量。因为前面96字节存放了header信息,所以第一个偏移量就是96了。
接下来我们需要再插入另外一条记录(3,'lisi'),之所以是3是因为我们后面需要插入2这条记录,这也是为了说明data page中数据行可以无序。执行下面代码插入数据并插卡data page内容:
--再插入另外一条记录
insert into t1 values(3,'lisi');
--查看页面信息
dbcc page(TESTDB,1,118,1);
上述查询过结果如下:

DATA:
Slot 0, Offset 0x60, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000D89A060
0000000000000000: 10001200 01000000 7a68616e 6773616e †........zhangsan
0000000000000010: 20200300 00†††††††††††††††††††††††††† ... Slot 1, Offset 0x75, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000D89A075
0000000000000000: 10001200 03000000 6c697369 20202020 †........lisi
0000000000000010: 20200300 00†††††††††††††††††††††††††† ... OFFSET TABLE:
Row - Offset
1 (0x1) - 117 (0x75)
0 (0x0) - 96 (0x60)

总结:
- 在offset table中多了一个row,并且两个offset相减刚好等于一个row的length=21.
- 在slot1中就是我们新插入的数据03000000 6c697369 20202020,这个可以通过求16进制得到,这里不再赘述。
接下来我们要插入一条记录(2,'wangwu'),这条记录中的id=2,刚好排在上面两条记录中间,我们查看插入这条结果以后会是什么结果。
insert into t1 values(2,'wangwu');
dbcc page(TESTDB,1,118,1);
执行上述查询以后我们得到如下结果:

DATA:
Slot 0, Offset 0x60, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000F82A060
0000000000000000: 10001200 01000000 7a68616e 6773616e †........zhangsan
0000000000000010: 20200300 00†††††††††††††††††††††††††† ... Slot 1, Offset 0x8a, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000F82A08A
0000000000000000: 10001200 02000000 77616e67 77752020 †........wangwu
0000000000000010: 20200300 00†††††††††††††††††††††††††† ... Slot 2, Offset 0x75, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x000000000F82A075
0000000000000000: 10001200 03000000 6c697369 20202020 †........lisi
0000000000000010: 20200300 00†††††††††††††††††††††††††† ... OFFSET TABLE:
Row - Offset
2 (0x2) - 117 (0x75)
1 (0x1) - 138 (0x8a)
0 (0x0) - 96 (0x60)

总结:
- 新插入的数据应该是0200000077616e67 77752020,这条记录是在slot1中,而原先slot1中的数据跑到了现在slot2的地方了,所以slot是排序的,但是slot并不是数据行的实际物理位置。
- 真正的实际物理位置应该通过offset来得到。我们发现新查询的数据的offset=0x8a,比前面两条记录的offset要大。所以证明在data page中,数据行可以使无序的。
- 我们再来查看offset table中的内容,我们发现row是有序排列的,但是offset是无序的。data page 正是通过offset来实现数据行的有序。
本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/07/30/2614465.html,如需转载请自行联系原作者
聚集表(clustered table)data page中的数据行可以无序的更多相关文章
- 在element的table修改事件中修改数据,table的数据也会修改
大家在修改的时候有的会通过点击事件里面获取点击列表的值然后去赋值,但是row是Object对象类型,如果直接赋值的话,就变成了浅拷贝,复制的是地址,导致在表单中改变值的时候table中的数据也跟着改变 ...
- 在vue中的form表单中下拉框中的数据来自数据库查询到的数据
文章目录 1.实现的效果: 2.前端html代码 3.js中的代码 4.后端的方法 1.实现的效果: 增加一个新的类型到数据库 2.前端html代码 需要注意的部分:prop后边是表单中的字段 v-m ...
- Jqueruy验证 form表单提交之前的中的数据
//---表单提交---- $("#destiation_form").submit(function(){ var from_city_value=$("#from_c ...
- 【Excle数据透视表】如何在Excle中使用数据鼠标拖放
数据透视表建立好之后,我们有时候需要改动数据透视表,那么直接可以对字段进行拖拽就可以改变,这样使数据透视变得比较方便使用 原始样式 拖拽后样式 步骤 右键数据透视表任意单元格→数据透视表选项→显示→经 ...
- Oracle中读取数据一些原理研究
文章很多摘录了 http://blog.163.com/liaoxiangui@126/blog/static/7956964020131069843572/ 同时基于这篇文章的基础上,补充一些学习要 ...
- iOS中的数据存储
SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite3常用的4种 ...
- 把数据库中的数据制作成Excel数据
把数据库中的数据制作成Excel数据 如果我们在使用Excel的时候,需要把数据库中的数据制作成Excel数据透视表,我们该怎么操作呢?如果数据在数据库中,我们不用把数据导入到工作表中,我们可以直接以 ...
- Openvswitch原理与代码分析(5): 内核中的流表flow table操作
当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行acti ...
- 通过dbcc page来查看表中的数据
--1.先建表 CREATE TABLE test(idd INT NOT NULL,name VARCHAR(10) NULL) INSERT INTO TEST SELECT 1,'abcdefg ...
随机推荐
- ASP.NET Core中的Controller
ASP.NET CORE出现之前我们实现的Controller,MVC都继承自Controller基类,WebApi的话继承自ApiController.现在ASP.NET CORE把MVC跟WebA ...
- 【Mongodb】聚合查询 && 固定集合
概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...
- MVC分层设计
MVC分层设计 什么是MVC? MVC 是一种软件架构模式,利用分层的思想来设计交互式应用程序,由以下3层组成: Model 业务模型层. View 展示层. Controller 控制层. MVC包 ...
- web系统安全运营之基础- 基于DFA算法的高性能的敏感词,脏词的检测过滤算法类(c#).
[概述]做好一个web系统的安全运维,除了常规的防注入,防入侵等,还有一个检测并过滤敏感词,脏词.. 这件事做得不好,轻则导致一场投诉或纠纷,重则导致产品被勒令关闭停运. 废话少说,先看下代码,可以 ...
- thinkphp5.0远程执行漏洞
0x01 漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以控制服务器) 0x02 环境搭建 Ph ...
- 前端笔记(关于css盒模型知识整理)
我以前整理的文章可能也不是特别深入.所以现在开始尝试即使多花点时间收集整理,也不只发浅层知识,这样对技术的深入理解是很有帮助的. 废话不多说,我们现在开始. 说到css盒模型,这是大多面试基础中会经常 ...
- python基础入门:matplotlib绘制多Y轴画图(附源码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:屁屁酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- [HarekazeCTF2019] web
在 buuoj 上看到的这个比赛题目,期间平台关了,就拿了 Dockerfile 本地做了,web 题目感觉还不错 encode_and_encode [100] 打开靶机,前两个页面都是 html ...
- Jmeter工具 组件简单认识
JMETER 所有的组件(元素)都是基于测试计划的,先有测试计划然后才有 JMETER 组件 JMETER 核心组件1.JMETER中的 Threads 类似与线程数,每一个线程数代表一个虚拟用户:测 ...
- 尝试用python开发一款图片压缩工具1:尝试 pillow库
开发目的 我经常使用图片.公众号文章发文也好,还是生活中要使用素材.图片是一种比文字更加直观的载体.但是图片更加占用带宽,很多软件都对图片有大小限制.图片太大也会影响加载速度.我试过几款图片压缩工具, ...