聚集表(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来实现数据行的有序。
聚集表(clustered table)data page中的数据行可以无序相关推荐
- 算法2.2 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。
数据结构(C语言版)严蔚敏 吴伟民 算法2.2 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.例如,设 LA= ...
- [vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗?
[vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗? 莫名其妙的问题.可以同名,但data会覆盖methods.并且本就不该同名,同名说明你命名不规范.然后解释为什么会覆盖,因为 ...
- 汇编语言:实验10 根据材料编程—3.数值显示,编程,将data段中的数据以十进制形式显示出来
问题描述 编程,将data段中的数据以十进制的形式显示出来. data segmentdw 123,12666,1,8,3,38 data ends 实验效果 实验要求 子程序描述 名称:dtoc 功 ...
- 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设 LA=(3,5,8,11) LB=(2,6,8,9,1
已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.例如,设 LA=(3,5,8,11) LB=(2,6,8,9,1 ...
- php连接数据库的表如何居中,在php中打印数据如何居中显示
. 1.引言 1.1制定本标准的目的是为了统一规范我省电大财经类本科毕业论文的格式,保证毕业论文的质量. 1.2毕业论文应采用最新颁布的汉语简化文字,符合<出版物汉字使用管理规定>,由作者 ...
- mysql表的组成_数据库中的数据表由什么组成?
在数据库中,数据表是由表名.表中的字段和表的记录三个部分组成的.在建立表之前都必须先设计它的结构,表结构描述了一个表的框架.设计表结构实际上就是定义组成一个表的字段个数,每个字段的名称.数据类型和长度 ...
- linux 误删除mysql表能恢复吗,Linux中误删除数据文件和归档日志的恢复方法
误删除前,归档日志2个,用户数据4480064条 复制代码 代码如下: [oracle@station90 datafile]$ sqlplus /nolog SQL> conn hr/hr C ...
- python 显示数据库数据tk_如何使用python显示从Mysql表获取的Tkinter treeview中的数据...
我已经用treeview创建了一个表,我想插入从mysql表中获取的数据.如果有人能帮助我,因为我已经尽了最大的努力,但仍然没有成功.使用这个语句tree.insert("", 1 ...
- 如何设置Oracle工作表有提示,excel表格中自动数据提醒-excel工作表中如何自动跳出提醒框...
excel表格怎么设置到期日前自动提醒功能 菜单项〉工具>选项.在图中选择.在弹出的对话框中把"记忆式键入"前面的对勾去掉行了. 详见图示. 在Excel表格里面怎样设置&q ...
最新文章
- 莫队 ---- CF 135D. Jeff and Removing Periods (等差数列预处理 + 莫队)
- 中山大学提出SimAM:无参Attention!助力分类/检测/分割涨点!
- 一文聊透binlog、redo log、undo log
- Django模版(三)
- html渐变效果做网页,CSS实现文本渐变效果
- 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历
- [react] componentWillUpdate可以直接修改state的值吗
- 捕获标志位_如何通过捕获标志挑战来提高网络安全技能-PicoCTF演练
- web里如何在背景图片上放置div元素_2020年web前端开发经典面试题总结整理(建议收藏)...
- 计算机无法共享磁盘分区,win7系统下怎么创建虚拟磁盘分区以达到网络共享的目的...
- 测试思路系列:《谷歌的软件测试之道》读书笔记
- Hi,我们的代码重构了
- iOS可视化动态绘制连通图(Swift版)
- python办公自动化——批量向excel填充数据
- vim keymap
- 在微信小程序中使用less
- 连载《国培计划》骨干教师的研修日志之八:米新江教授讲座有感
- 好用的z3数独求解器
- 刘霄前端技术开发日志
- 把英文单词转换成ASCII画
热门文章
- c# mysql存储过程 输出参数值_MySQL 存储过程参数用法 in, out, inout
- android 获取gpio电平值_使用GPIO实现SPI协议操作OLED
- C#窗体在任务栏对窗体放大或缩小
- 树状数组 / 二维树状数组
- 数据结构Java版之基数排序(四)
- js原生事件委托的实现
- 前端工程师都会喜欢的5个JavaScript库
- Sql Server和oracle的函数区别总结
- 大二生活之致给影响我最大的大学老师,我和老师的一些事
- SpringCloud创建Config Client通过Eureka访问Config