位置: 编程技术 - 正文
推荐整理分享Sql server中内部函数fn_PhysLocFormatter存在解析错误详解(sql server内存怎么设置合理),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:sql server 内存数据库,sql server内置函数,sql server 内存数据库,sql的内置方法,sqlserver内部版本号,sql server内存表,sql内部连接,sql server 内存数据库,内容如对您有帮助,希望把文章链接给更多的朋友!
前言
有网友指出,SQL Server 中fn_PhysLocFormatter内部函数在解析数据行记录位置时存在错误,见:
SiteID
%%physloc%%
sys.fn_PhysLocFormatter(%%physloc%%)
1
0xE
(1::0)
0xE
(1::1)
0xE
(1::2)
......
0xEF
(1::)
0xE
(1::)
0xE
(1::)
0xE
(1::)
......
0xECC
(1::)
0xECD
(1::)
0x4B
(1::0)
0x4B
(1::1)
......
0x4BF
(1::)
0x4B
(1::)
0x4B
(1::)
0x4B
(1::)
......
0x4BBD
(1::)
0x4BBE
(1::)
0x3C
(1::0)
0x3C
(1::1)
......
0x3C
(1::)
0x3C
(1::)
0x3CAC
(1::)
0x
(1::0)
......
0xD
(1::)
下面查看表NT_SiteInfo分配的数据页情况。
PagePID
IAMFID
IAMPID
PageType
IndexLevel
NextPagePID
PrevPagePID
NULL
NULL
NULL
0
0
1
1
0
0
1
1
0
1
1
0
1
1
0
0
Microsoft未公开的伪列%%physloc%%,类型为Binary(8),返回表中记录的RowID,格式是:前4字节表示页号,中间2字节表示文件号,最后2字节表示槽号。
对照上面的实际数据,可以发现sys.fn_PhysLocFormatter在解析记录位置时,既有采用高字节在前的BIG_ENDIAN格式,又有采用低字节在前的LITTLE_ENDIAN格式,造成采用高字节在前的BIG_ENDIAN格式解析的数据错误:
页号解析:E解析为(E),错误,实际应为(E9)
4B解析为(B),正确
3C解析为(C),正确
解析为(),错误,实际应为()
槽号解析:
解析为(),正确
解析为(),错误,应为()
下面给出错误原因。
先看下sys.fn_PhysLocFormatter函数的定义:
再看下reverse函数:
结论:问题出在reverse函数上。
reverse函数的作用是字符反转,而不是字节反转,当遇到-FE之间的字节时,被认为是双字节字符而组合在一起参与反转操作,造成了错误。
总结
友情链接: 武汉网站建设