DBCC page 数据页 堆 底层数据分布大小计算
1.行的总大小:
Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4(4是指行标题开销)
开销定义:
Fixed_Data_Size = 所有固定长度列的总字节大小
Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
---通过调节Max_Var_Size来满足最大存储空间
Null_Bitmap = 2 + ((Num_Cols + 7) / 8)(要抛弃余数哦)
---保留行中称为 Null 位图的部分来管理列的为空性
page=8k=8*1024=8192字节
其中每页可用字节=8192-96=8096
下面我通过创建新表添加数据验证下:
CREATE TABLE [dbo].[PageSize]
(
[a] [int] NULL,--4字节
[b] [nvarchar](3500) NULL,--7000字节哦
[c] CHAR(4)NULL,--2字节
[d] DATETIME NULL,--8字节
[e] MONEY NULL --8字节
) ON [PRIMARY]
--插入数据
insert [PageSize]
values(1,REPLICATE('A',3500),'KING','2016-05-12 10:41:41.843',89.12)
insert [PageSize]
values(2,REPLICATE('B',3500),'KING','',0)
insert [PageSize]
values(3,REPLICATE('D',3500),'KING','2016-05-12 10:41:41.843',89.00)
insert [PageSize]
values(3,REPLICATE('E',3500),'KING','2016-05-12 10:41:41.843',89.1)
insert [PageSize]
values(3,REPLICATE('F',3500),'KING','2016-05-12 10:41:41.843',89.2)
我们算下第一行行长度:
根据以上公式算下哦:
size=4+4+8+8+7004+3+4=7035(鉴证奇迹的时候到了)
请继续往下面看哦!
--查看页信息
dbcc traceon(3604)
--查看库中表的信息
DBCC SHOWCONTIG
DBCC SHOWCONTIG 正在扫描 'PageSize' 表...
表: 'PageSize' (901578250);索引 ID: 0,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 6
- 扫描区数..............................: 3
- 区切换次数..............................: 2
- 每个区的平均页数........................: 2.0
- 扫描密度 [最佳计数:实际计数].......: 33.33% [1:3]
- 区扫描碎片 ..................: 0.00%
- 每页的平均可用字节数.....................: 2231.5
- 平均页密度(满).....................: 72.43%
--查看库中页集合
dbcc extentinfo(TEST,PageSize)
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
1 156 1 1 901578250 0 1 72057594039304192 In-row data 0x6300000000000000
1 164 1 1 901578250 0 1 72057594039304192 In-row data 0x6300000000000000
1 165 1 1 901578250 0 1 72057594039304192 In-row data 0x6300000000000000
1 166 1 1 901578250 0 1 72057594039304192 In-row data 0x6300000000000000
1 168 1 1 901578250 0 1 72057594039304192 In-row data 0x6300000000000000
1 169 1 1 901578250 0 1 72057594039304192 In-row data 0x6000000000000000
看到page页号:
找到第一行 page_id 为156
dbcc page(test,1,156,3)
下面我来拷贝出来大家看下:(这里都没有截图啊,不影响看)
下面蓝字体:第一行是m_pageId = (1:156) 没问题吧
你再看下最后一行:Record Size = 7035 实际记录大小哦
m_pageId = (1:156) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 88 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594043695104
Metadata: PartitionId = 72057594039304192 Metadata: IndexId = 0
Metadata: ObjectId = 901578250 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 28 m_slotCnt = 1 m_freeCnt = 1059
m_freeData = 7131 m_reservedCnt = 0 m_lsn = (492:6024:2)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 0 DB Frag ID = 1
Allocation Status
GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED
PFS (1:1) = 0x63 MIXED_EXT ALLOCATED 95_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED
Slot 0 Offset 0x60 Length 7035
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 7035
再来看下dbcc page(test,1,156,3)这个命令分析吧!
PAGE: (1:156) --数据页编号
BUFFER:
BUF @0x00000003FB178AC0 -- 内存中页号
bpage = 0x00000003EFB32000 物理页面 bhash = 0x0000000000000000 bpageno = (1:156) --对应物理文件的页面号
bdbid = 8 --对应的数据库ID breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 63157 bstat = 0x10b
blog = 0x15acc bnext = 0x0000000000000000
PAGE HEADER:
--页头96字节
Page @0x00000003EFB32000
m_pageId = (1:156) --页号 m_headerVersion = 1 m_type = 1 --数据页类型,1:堆表和聚集索引的叶子节点数据
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 88 表id m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594043695104
Metadata: PartitionId = 72057594039304192 Metadata: IndexId = 0
Metadata: ObjectId = 901578250 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 28 m_slotCnt = 1 --当页行数 m_freeCnt = 1059--这里剩余空间哦
m_freeData = 7131--这是7035+表头96哦 也是下次插入数据的起始位置 m_reservedCnt = 0 m_lsn = (492:6024:2)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 0 DB Frag ID = 1
这里插一句 大家可能看到了7131+1059=8290?? --实际还要加+行偏移指针数组
因此 7131+1059+2=8292
Allocation Status
GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED
PFS (1:1) = 0x63 MIXED_EXT ALLOCATED 95_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED
Slot 0 Offset 0x60 Length
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 7035
Memory Dump @0x0000000012E1A060
DBCC page 数据页 堆 底层数据分布大小计算的更多相关文章
- (4.4)dbcc checkdb 数据页修复
转自:http://blog.51cto.com/lzf328/955852 三篇 一.创建错误数据库 以前看Pual写过很多数据恢复的文章,他很多的测试都是自己创建的Corrupt数据库,其实我们自 ...
- 利用DBCC PAGE查看SQL Server中的表和索引数据
16:08 2013-01-06 参考http://doc.chinaunix.net/sqlserver/200810/206034.shtmlDBCC PAGE|IND 参数 DBCC PAGE ...
- 数据页结构 .InnoDb行格式、以及索引底层原理分析
局部性原理 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中. 首先要明白局部性原理能解决的是什么问题,也就是主存容量远远比缓存大, CP ...
- 通过dbcc page来查看表中的数据
--1.先建表 CREATE TABLE test(idd INT NOT NULL,name VARCHAR(10) NULL) INSERT INTO TEST SELECT 1,'abcdefg ...
- 【生产问题】-dbcc checkdb报错-数据页故障
更多操作参考:https://www.cnblogs.com/gered/p/9435282.html [生产问题]-dbcc checkdb报错-数据页故障 数据页故障,索引页故障 use db_t ...
- 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
- SQL Server 存储(1/8):理解数据页结构
我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...
- SQL Server :理解数据页结构
原文:SQL Server :理解数据页结构 我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或 ...
- SQL SERVER大话存储结构(1)_数据页类型及页面指令分析
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! SQLServer的数据页大 ...
随机推荐
- 关于pipelineDB调用GetLocalStreamReaders的BUG
如果想获取一个stream所有的reader,那么必须调用这个函数: Bitmapset *targets = GetLocalStreamReaders(relid); 如果stream下面没有re ...
- jvm内存回收诡异现象
在知乎上看到一篇提问,于是做了个实验帮助他解答,这里整理成一篇文章分享一下. 先看代码如下代码: /** * Created on 2017/12/16. * * -verbose:gc -XX:+U ...
- Tomcat启动慢解决方法(本人CentOS7.4系统)
首先查看日志信息,查看因为什么而启动慢 在CentOS7启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ...
- Git 二分调试法,火速定位疑难Bug!
你一定遇到过,一个很久没修改过的功能,莫名其妙的出现了问题?肉眼查代码.屡逻辑完全找不到问题点?前两天还好好的功能,怎么这个今天就不行了?这两天改动了这么多代码,到底是那一次改动引发的 Bug? 这样 ...
- 》》3D轮播
* { margin: 0; padding: 0; } .slide { position: absolute; top: calc(50% - 150px); left: calc(50% - 3 ...
- 记一次高并发场景下.net监控程序数据上报的性能调优
最近在和小伙伴们做充电与通信程序的架构迁移.迁移前的架构是,通信程序负责接收来自充电集控设备的数据实时数据,通过Thrift调用后端的充电服务,充电服务收到响应后放到进程的Queue中,然后在管理线程 ...
- Python&MySQL&PyQt
环境: Python2.7+MySQL5.6+PyQt4 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/40 ...
- TortoiseSVN/TortoiseGIT文件夹或图标不显示,非Overlay Icon
网上搜索TortoiseSVN/TortoiseGIT的图标不显示,大部分的方法都是修改Overlay Icon的名字,让Tortoise排在前面. 然后我却遇到的问题上述方法并不能解决. 我的解决办 ...
- (转)spring aop
工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大说过:“开发人员不可能一天到晚只有工作,肯定是需要自我学习.第一:为了更充实自己,保持进步状态.第二:为了提升技术,提高开发能力.第三:保 ...
- (转自知乎https://www.zhihu.com/question/20794107)动态代理
作者:雨夜偷牛的人链接:https://www.zhihu.com/question/20794107/answer/23330381来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...