背景:
今天被人文集forwarded和forwarding記錄的事情。
簡單介紹:
當堆表跟新某一個列的時候發現,不夠放了,那么就在那行記錄上標記forwarding,并把數據放到另外一個page,行被標記上forwarded。
有《深入解析 sql server 2008》 可以看 p272,里面稍微有點提及
關于page的資料:
可以查看http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/
DROP TABLE bigrows;GOCREATE TABLE bigrows( a int IDENTITY PRIMARY KEY,b varchar(1600),c varchar(1600));GOINSERT INTO bigrowsVALUES (REPLICATE('a', 1600), '');INSERT INTO bigrowsVALUES (REPLICATE('b', 1600), '');INSERT INTO bigrowsVALUES (REPLICATE('c', 1600), '');INSERT INTO bigrowsVALUES (REPLICATE('d', 1600), '');INSERT INTO bigrowsVALUES (REPLICATE('e', 1600), '');GOUPDATE bigrowsSET c = REPLICATE('x', 1600)WHERE a = 3;GODBCC IND(tst,bigrows,1)
之后 dbcc page 就會看到a=3這一行被forward了。
返回:04e42100 00010001 00
0x04表示forwarded記錄,e4210000 表示forward的page(paul blog的說法和 《深入解析 sql server 2008》說法不一致,我認為paul blog內的說法更加靠譜),中間那個1 表示fileid,最后一個1表示slowid,根據paul blog的說法:
http://www.sqlskills.com/blogs/paul/forwarding-and-forwarded-records-and-the-back-pointer-size/#comment-87661
2-byte file ID, 4-byte page-in-file, 2-byte slot ID
forwarding記錄頭(不包含可變數據)
返回:32000800 05000000 03000003 00530693 0c9d8c
普通記錄(不包含可變數據)
返回:30000800 06000000 03000002 00510654 06
0x32其中可以通過發的paul的blog里面可以發現這個行是forwarded。之后的和普通的行格式是一樣的,會發現多了1個可變列,并且存的是forwarding的page信息。
最后一個可變字段數據:00 04e22100 00010002 00 。
新聞熱點
疑難解答