位置: 编程技术 - 正文

SQL Server数据库中伪列及伪列的含义详解(sql server数据库中的null(空值))

编辑:rootadmin

推荐整理分享SQL Server数据库中伪列及伪列的含义详解(sql server数据库中的null(空值)),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sqlserver数据库端口号怎么查看,sql server数据库恢复,sqlserver数据库安装步骤,sqlserver数据库备份,sqlserver数据库安装步骤,sql server数据库中的null(空值),sql server数据库中的null(空值),sql server数据库查询语句,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Server中的伪列

下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值;对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个常识,对此不作具体详细阐述。

这里主要是提到的RowId引起了一点思考。

那么,这个RowId是个什么玩意?能不能更加直观一点来看看RowId的信息?代表什么含义?这个当然也是可以的。

Oracle中的表中有一个伪列的概念,就是在查询表的时候加上select rowid,* from Table,会查询出来伪列。

SQL Server中同样有这么一个伪列,在SQL Server中,这个伪列可以认为是数据行的物理地址,下面简单来观察一下这个RowId以及RowId的含义。

伪列的测试

建一张简单的表,下面借助这个表来查看说明伪列

SQL Server中有一个未公开的伪列“%%physloc%%”,也就是在查询的时候,对于任何一张表,可以加上这个字段,比如如下,就可以查到表中每一行的伪列。

这个伪列的类型是binary(8) ,也就是有8个字节,参考上图的DATALENGTH(%%physloc%%) as Len,%%physloc%%返回的记录的物理地址,其中前四个字节表示页号,中间两个字节表示文件号,最后两个字节表示槽号为了更加方便地观察伪列的含义,sqlserver提供了一个未公开的系统函数sys.fn_PhysLocFormatter,下面借助sys.fn_PhysLocFormatter这个函数来继续观察这个伪列

如下图,这里就可以清晰地看到伪列中的信息了。

比如第一行中的(1::0),上面说了,其中前四个字节表示页号,中间两个字节表示文件号,最后两个字节表示槽号,(1::0)这种格式是经过sys.fn_PhysLocFormatter格式化显式之后的结果。

把文件号1放在最前面,中间的是页号(page number),最后一位0是槽号(sloc number)。

下面粗略地说一下这几个字段的含义。这里要求对SQL Server的存储只是有一个基本的认识,否则看的云里雾里。

1,首先说什么是文件号

如截图,文件号就是数据库的数据文件编号,这里只有一个数据文件,文件编号为1,建表的时候默认(这里也只能建立)建立在fileid = 1 的文件上面,fileid=2的是日志文件,就不多说了。

2,其次是页号,页号就是分配给当前这张表的数据页面(8kb的最小分配单元)的页号,我们看一下Test这个表的页面情况

SQL Server数据库中伪列及伪列的含义详解(sql server数据库中的null(空值))

借助DBCC IND命令,查询分配给这个表的页面信息,其中号页面是IMA也面,至于什么事IMA页面,不多解释。

号页面才是真正存储数据的页,与上面的1::0中的一样,没毛病。

  

3,最后看一下槽号,槽号的概念要对SQL Server的数据页面有一个基本的认识,这里盗用一张网友的图。

所谓的槽号就是在数据页面中,每个页面存储多行数据,槽号用来标记每一行数据的偏移量,用大白话说就是“存储每一行数据的地址空间开始的位置”,因为每一行数据的总长度是不一样的(存在可变长度列的情况下),每一行的占用的存储空间也是不一样的,槽号或者行偏移量就是说明每一行数据在页内的开始位置。

不过sys.fn_PhysLocFormatter格式化显式的槽号并不是如下截图的偏移量,而是第N个数据行的这个N的信息,因此第1行的槽号就是1,第2行的槽号就是2,以此类推,当第一个page存储满之后,从第二个page开始存储,槽号又从0开始编号且累加

  

  

至此,对SQL Server的伪列,也就说经常说的RowId有了一个简单的认识。

这里可以认为,在SQL Server数据库中,伪列RowId就是数据行的物理地址,至于别的数据库中的伪列(RowId)是不是物理地址倒是不确定(很有可能也是的)

这里简单提一下一开始说的一个问题:为什么SQL Server的聚集表(有聚集索引的表)存储数据的时候存储的是“索引键值+聚集索引键值”,对于非聚集索引表,索引存储的是索引键值+RowId?

或者反过来说,为什么聚集索引表的非聚集索引存储的是“索引键值+聚集索引键值”而不是“索引存储的是索引键值+RowId”

作为一个常识,聚集索引要按照聚集索引的顺序存放,这就意味着聚集索引表的行数据物理位置有可能发生变化,比如在众所周知的“页拆分(page split)”中发生变化,在数据行的物理位置发生了变化的时候,如果非聚集索引存储的是索引键值+RowId,那么这个RowId也势必要发生变化,这个变化当然要耗费一定的性能,为了防止此种情况的发生,聚集表中的非聚集索引存储成相对不变的索引键值+聚集索引键值,因为在数据行的物理位置发生变化的时候,聚集索引键值是相对不变的,这一点也不难理解。

当然有一种例外,当对聚集索引表做更新的时候,直接更新聚集索引的键值,这样的话,也有可能造成聚集索引表中当前数据行的物理位置发生变化,这一点也比较有意思,就不展开叙述了。

这一点跟绕口令一样,这里要求对SQL Server中的聚集索引和非聚集索引,以及存储结构有一个基础的认识才容易理解。

最后高能预警

高能预警,别说我瞎比比误导人,上述解析伪列的函数sys.fn_PhysLocFormatter是一个未公开的函数,未公开的函数就有可能潜在一些问题,事实上这个函数有一个非常严重的bug。

该bug就是在解析物理存储位置的时候有一定的逻辑错误,这个问题早有细心的人分析过了

参考: Server 中仍然存在bug,N前年啃书的时候就了解到有这么一个函数,但是一直不想提及sys.fn_PhysLocFormatter这个函数的原因,因此对于未公开的函数,请不要做验证性测试,再次声明:该函数有bug,请谨慎使用。

附上这个函数的源代码,并参考原文的结论

问题出在reverse函数上。

reverse函数的作用是字符反转,而不是字节反转,当遇到-FE之间的字节时,被认为是双字节字符而组合在一起参与反转操作,造成了错误。

总结

本文简单阐述了SQL Server中的伪列,以及伪列的含义,通过伪列对非聚集索引以及数据行的存储结构有一个简单的了解。

好了,

标签: sql server数据库中的null(空值)

本文链接地址:https://www.jiuchutong.com/biancheng/347091.html 转载请保留说明!

上一篇:关于SQL Server中bit类型字段增删查改的一些事(在sql server中关于数据库的说法正确的是)

下一篇:Sql server中内部函数fn_PhysLocFormatter存在解析错误详解(sql server内存怎么设置合理)

  • 销项税额期末余额
  • 纳税义务发生时间 纳税期限
  • 营利性医疗机构筹建是什么意思
  • 税务安全证书应用客户端
  • 开出已验旧的发票怎么办
  • 进项税额结转不结转
  • 普票冲红原票要退回吗
  • 企业股东分红所得税税率表
  • 收到投资款怎么做记账凭证
  • 佣金是否要交所得税
  • 餐饮刷卡机手续费多少
  • 冲回上年多提的费用会计分录
  • 付现金给别的公司是否可以开具发票呢?
  • 单位车转到个人名下要什么材料
  • 管理费用月末怎么结账
  • 物业费增值税收入的确认最新政策
  • 收到子公司分红需要交所得税吗?
  • 学校里的水电费是政府买单吗
  • 调整以前年度的库存
  • 汇算清缴前可以更改去年的账吗
  • 增值税加计扣除是什么意思啊
  • win11和win10比较
  • 鸿蒙工具箱巅峰模式有什么用
  • 孕妇可以喝蜂蜜水吗?
  • 哪些情况需要补钙
  • 企业出租经营权是否征税
  • 财务软件税率
  • 消防工程改造需要什么资质
  • 清理c盘清理
  • 拼多多改地址怎么改视频
  • thinkphp钩子场景
  • php link指令
  • 违约金要计入应纳税所得额吗
  • 以非现金资产清偿债务的,债权人应当
  • 盘亏应交税费
  • laravel视频教程
  • vue项目如何配置启动的端口
  • 劳务公司给包工头打款备注写什么
  • 卡克斯劳坦恩酒店
  • 房地产企业销售佣金税前扣除
  • php面试题目100及最佳答案
  • 哪些可以计入研发费用
  • phpcms文档
  • 小规模纳税人去年免税,红冲后今年开多少税率的发票
  • 捐款 企业
  • 弃置费用的现值计入固定资产
  • sql server字符连接
  • 企业所得税实施条例第22条
  • 软件开发企业怎么结转成本
  • 公司的资本公积金
  • 普票部分红冲发票需要收回原发票吗
  • 成品油购进数据选择没有发票
  • 分红做什么会计分录
  • 金税盘每年服务费可以抵扣吗
  • 短期理财收益账务分录
  • 附加税减免需要转营业外收入吗
  • 税控盘和金税盘一样吗
  • 建筑企业案例
  • office技术预览版和增强版
  • 服务器找不到存储盘
  • 重装系统重启后怎么操作
  • macbook不可以插u盘吗
  • win7启动应用程序的方式
  • windows更新后风扇不转
  • 高德地图自动跳出来
  • [置顶]公主大人接下来是拷问时间31
  • javascript 操作css
  • html+css代码
  • python自动报表
  • glviewport超出屏幕范围
  • easyui grid
  • jquery width
  • 分享js粘帖屏幕怎么弄
  • Python 正则表达式的高级用法
  • 重庆电子税务局网页版登录
  • 地税税号查询系统
  • 刷医保的网络可以用外网吗
  • 党建工作领导小组会议
  • 甘肃省35条措施的内容是什么
  • 发票机如何打印文件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设