Sql server內部函式fn_PhysLocFormatter存在解析錯誤

cow977發表於2012-12-26
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

有網友指出,SQL Server 2012fn_PhysLocFormatter內部函式在解析資料行記錄位置時存在錯誤,見:http://www.itpub.net/thread-1751655-1-1.html

實際測試後發現,一是2008R2中同樣存在問題,二是不僅頁號解析存在問題,槽號解析也存在同樣問題。

下面先檢視錶NT_SiteInfo的資料行記錄位置。

select SiteID,%%physloc%%,sys.fn_PhysLocFormatter(%%physloc%%) from NT_SiteInfo

SiteID

%%physloc%%

sys.fn_PhysLocFormatter(%%physloc%%)

1

0xE900000001000000

(1:59648:0)

23

0xE900000001000100

(1:59648:1)

24

0xE900000001000200

(1:59648:2)

 

......

 

149

0xE900000001007F00

(1:59648:127)

150

0xE900000001008000

(1:59648:128)

151

0xE900000001008100

(1:59648:33024)

152

0xE900000001008200

(1:59648:33280)

 

......

 

226

0xE90000000100CC00

(1:59648:52224)

227

0xE90000000100CD00

(1:59648:52480)

228

0x4B02000001000000

(1:587:0)

229

0x4B02000001000100

(1:587:1)

 

......

 

360

0x4B02000001007F00

(1:587:127)

361

0x4B02000001008000

(1:587:128)

362

0x4B02000001008100

(1:587:33024)

363

0x4B02000001008200

(1:587:33280)

 

......

 

422

0x4B0200000100BD00

(1:587:48384)

423

0x4B0200000100BE00

(1:587:48640)

424

0x3C05000001000000

(1:1340:0)

425

0x3C05000001000100

(1:1340:1)

 

......

 

552

0x3C05000001008000

(1:1340:128)

553

0x3C05000001008100

(1:1340:33024)

 

 

 

596

0x3C0500000100AC00

(1:1340:44032)

597

0x9978000001000000

(1:39288:0)

 

......

 

658

0x9978000001003D00

(1:39288:61)

 

下面檢視錶NT_SiteInfo分配的資料頁情況。

dbcc ind(wjgk,nt_siteinfo,0)

PagePID

IAMFID

IAMPID

PageType

IndexLevel

NextPagePID

PrevPagePID

238

NULL

NULL

10

NULL

0

0

233

1

238

1

0

587

0

587

1

238

1

0

1340

233

1340

1

238

1

0

30873

587

30873

1

238

1

0

0

1340

 

Microsoft未公開的偽列%%physloc%%型別為Binary(8)返回表中記錄的RowID格式是4位元組表示頁號,中間2位元組表示檔案號,最後2位元組表示槽號。

對照上面的實際資料,可以發現sys.fn_PhysLocFormatter在解析記錄位置時,既有采用高位元組在前的BIG_ENDIAN格式,又有采用低位元組在前的LITTLE_ENDIAN格式,造成採用高位元組在前的BIG_ENDIAN格式解析的資料錯誤:

頁號解析:

E9000000解析為59648E900),錯誤,實際應為233E9

4B020000解析為57624B),正確

3C050000解析為134053C),正確

99780000解析為392889978),錯誤,實際應為308737899

槽號解析:

8000解析為1280080),正確

8100解析為330248100),錯誤,應為1290081

相關文章