亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server數據庫中偽列及偽列的含義詳解

2024-08-31 01:05:06
字體:
來源:轉載
供稿:網友

SQL Server中的偽列

下午看QQ群有人在討論(非聚集)索引的存儲,說,對于聚集索引表,非聚集索引存儲的是索引鍵值+聚集索引鍵值;對于非聚集索引表,索引存儲的是索引鍵值+RowId,這應該是一個常識,對此不作具體詳細闡述。

這里主要是提到的RowId引起了一點思考。

那么,這個RowId是個什么玩意?能不能更加直觀一點來看看RowId的信息?代表什么含義?這個當然也是可以的。

Oracle中的表中有一個偽列的概念,就是在查詢表的時候加上select rowid,* from Table,會查詢出來偽列。

SQL Server中同樣有這么一個偽列,在SQL Server中,這個偽列可以認為是數據行的物理地址,下面簡單來觀察一下這個RowId以及RowId的含義。

偽列的測試

建一張簡單的表,下面借助這個表來查看說明偽列

CREATE TABLE Test( id int identity(1,1), name varchar(50))GOINSERT INTO Test VALUES (NEWID())GO 100

SQL Server中有一個未公開的偽列“%%physloc%%”,也就是在查詢的時候,對于任何一張表,可以加上這個字段,比如如下,就可以查到表中每一行的偽列。

sqlserver,偽列,sql,server

這個偽列的類型是binary(8) ,也就是有8個字節,參考上圖的DATALENGTH(%%physloc%%) as Len,%%physloc%%返回的記錄的物理地址,其中前四個字節表示頁號,中間兩個字節表示文件號,最后兩個字節表示槽號
為了更加方便地觀察偽列的含義,sqlserver提供了一個未公開的系統函數sys.fn_PhysLocFormatter,下面借助sys.fn_PhysLocFormatter這個函數來繼續觀察這個偽列

如下圖,這里就可以清晰地看到偽列中的信息了。

sqlserver,偽列,sql,server

比如第一行中的(1:73:0),上面說了,其中前四個字節表示頁號,中間兩個字節表示文件號,最后兩個字節表示槽號,(1:73:0)這種格式是經過sys.fn_PhysLocFormatter格式化顯式之后的結果。

把文件號1放在最前面,中間的73是頁號(page number),最后一位0是槽號(sloc number)。

下面粗略地說一下這幾個字段的含義。這里要求對SQL Server的存儲只是有一個基本的認識,否則看的云里霧里。

1,首先說什么是文件號

如截圖,文件號就是數據庫的數據文件編號,這里只有一個數據文件,文件編號為1,建表的時候默認(這里也只能建立)建立在fileid = 1 的文件上面,fileid=2的是日志文件,就不多說了。

sqlserver,偽列,sql,server

2,其次是頁號,頁號就是分配給當前這張表的數據頁面(8kb的最小分配單元)的頁號,我們看一下Test這個表的頁面情況

借助DBCC IND命令,查詢分配給這個表的頁面信息,其中77號頁面是IMA也面,至于什么事IMA頁面,不多解釋。

73號頁面才是真正存儲數據的頁,與上面的1:73:0中的73一樣,沒毛病。

  sqlserver,偽列,sql,server

3,最后看一下槽號,槽號的概念要對SQL Server的數據頁面有一個基本的認識,這里盜用一張網友的圖。

所謂的槽號就是在數據頁面中,每個頁面存儲多行數據,槽號用來標記每一行數據的偏移量,用大白話說就是“存儲每一行數據的地址空間開始的位置”,因為每一行數據的總長度是不一樣的(存在可變長度列的情況下),每一行的占用的存儲空間也是不一樣的,槽號或者行偏移量就是說明每一行數據在頁內的開始位置。

不過sys.fn_PhysLocFormatter格式化顯式的槽號并不是如下截圖的偏移量,而是第N個數據行的這個N的信息,因此第1行的槽號就是1,第2行的槽號就是2,以此類推,當第一個page存儲滿之后,從第二個page開始存儲,槽號又從0開始編號且累加

  sqlserver,偽列,sql,server

  sqlserver,偽列,sql,server

至此,對SQL Server的偽列,也就說經常說的RowId有了一個簡單的認識。

這里可以認為,在SQL Server數據庫中,偽列RowId就是數據行的物理地址,至于別的數據庫中的偽列(RowId)是不是物理地址倒是不確定(很有可能也是的)

這里簡單提一下一開始說的一個問題:
為什么SQL Server的聚集表(有聚集索引的表)存儲數據的時候存儲的是“索引鍵值+聚集索引鍵值”,對于非聚集索引表,索引存儲的是索引鍵值+RowId?

或者反過來說,為什么聚集索引表的非聚集索引存儲的是“索引鍵值+聚集索引鍵值”而不是“索引存儲的是索引鍵值+RowId”

作為一個常識,聚集索引要按照聚集索引的順序存放,這就意味著聚集索引表的行數據物理位置有可能發生變化,比如在眾所周知的“頁拆分(page split)”中發生變化,在數據行的物理位置發生了變化的時候,如果非聚集索引存儲的是索引鍵值+RowId,那么這個RowId也勢必要發生變化,這個變化當然要耗費一定的性能,為了防止此種情況的發生,聚集表中的非聚集索引存儲成相對不變的索引鍵值+聚集索引鍵值,因為在數據行的物理位置發生變化的時候,聚集索引鍵值是相對不變的,這一點也不難理解。

當然有一種例外,當對聚集索引表做更新的時候,直接更新聚集索引的鍵值,這樣的話,也有可能造成聚集索引表中當前數據行的物理位置發生變化,這一點也比較有意思,就不展開敘述了。

這一點跟繞口令一樣,這里要求對SQL Server中的聚集索引和非聚集索引,以及存儲結構有一個基礎的認識才容易理解。

最后高能預警

高能預警,別說我瞎比比誤導人,上述解析偽列的函數sys.fn_PhysLocFormatter是一個未公開的函數,未公開的函數就有可能潛在一些問題,事實上這個函數有一個非常嚴重的bug。

該bug就是在解析物理存儲位置的時候有一定的邏輯錯誤,這個問題早有細心的人分析過了

目前測試來看,在SQL Server 2014中仍然存在bug,N前年啃書的時候就了解到有這么一個函數,但是一直不想提及sys.fn_PhysLocFormatter這個函數的原因,因此對于未公開的函數,請不要做驗證性測試,再次聲明:該函數有bug,請謹慎使用。

附上這個函數的源代碼,并參考原文的結論

create function sys.fn_PhysLocFormatter (@physical_locator binary (8)) returns varchar (128)as begin declare @page_id binary (4) declare @file_id binary (2) declare @slot_id binary (2) -- Page ID is the first four bytes, then 2 bytes of page ID, then 2 bytes of slot -- select @page_id = convert (binary (4), reverse (substring (@physical_locator, 1, 4))) select @file_id = convert (binary (2), reverse (substring (@physical_locator, 5, 2))) select @slot_id = convert (binary (2), reverse (substring (@physical_locator, 7, 2))) return '(' + cast (cast (@file_id as int) as varchar) + ':' + cast (cast (@page_id as int) as varchar) + ':' + cast (cast (@slot_id as int) as varchar) + ')' end

問題出在reverse函數上。

reverse函數的作用是字符反轉,而不是字節反轉,當遇到81-FE之間的字節時,被認為是雙字節字符而組合在一起參與反轉操作,造成了錯誤。

總結

本文簡單闡述了SQL Server中的偽列,以及偽列的含義,通過偽列對非聚集索引以及數據行的存儲結構有一個簡單的了解。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。

 

注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美肥老太性生活视频| 日韩电影大片中文字幕| 欧美国产日韩中文字幕在线| 奇米成人av国产一区二区三区| 最近2019年中文视频免费在线观看| 欧美性xxxx极品高清hd直播| 精品国产一区二区三区久久久狼| 8090成年在线看片午夜| 成人免费高清完整版在线观看| 国产成人av在线| 国产伦精品一区二区三区精品视频| 日韩精品在线视频观看| 日韩综合视频在线观看| www高清在线视频日韩欧美| 亚洲一区二区三区久久| 久久综合九色九九| 国产精品久久久久av| 亚洲国产精品女人久久久| 精品一区电影国产| 国产日韩av在线| 国外成人在线视频| 91老司机精品视频| 久久久国产一区二区| 精品亚洲一区二区三区在线观看| 欧美老少配视频| 亚洲欧美视频在线| 91精品视频在线免费观看| 久久精视频免费在线久久完整在线看| 日韩av免费在线| 国内精品美女av在线播放| 日韩电影在线观看中文字幕| 欧洲成人在线观看| 国产精品999| 日韩欧美亚洲一二三区| 国产精品老女人视频| 成人两性免费视频| 中文字幕亚洲欧美日韩在线不卡| 在线播放国产一区二区三区| 国产精品入口日韩视频大尺度| 在线观看日韩www视频免费| 色偷偷91综合久久噜噜| 91精品国产91久久久久| 秋霞午夜一区二区| 一道本无吗dⅴd在线播放一区| 国产精品极品美女粉嫩高清在线| 欧美激情精品在线| 韩国日本不卡在线| 精品美女永久免费视频| 精品自拍视频在线观看| 中文字幕亚洲无线码在线一区| 亚洲欧美日韩在线一区| 一区二区三区日韩在线| 疯狂蹂躏欧美一区二区精品| 日韩中文有码在线视频| 中文字幕国产精品久久| 欧美中文在线免费| 日韩高清人体午夜| 午夜精品久久久久久久久久久久| 久久精品视频中文字幕| 亚洲成色777777女色窝| 91av视频在线播放| 中文字幕精品av| 欧美大片欧美激情性色a∨久久| 国产69精品久久久久99| www.日韩不卡电影av| 国产视频精品自拍| 在线播放日韩av| 26uuu亚洲国产精品| 久久久久久久一区二区三区| 国产精品久久久久久搜索| 国产91精品视频在线观看| 国内外成人免费激情在线视频| 日韩网站免费观看高清| 国产精品嫩草视频| 日韩女优在线播放| 亚洲综合色av| 亚洲国产私拍精品国模在线观看| 九九久久久久99精品| 日韩精品免费在线| 亚洲精品999| 亚洲国模精品一区| 国产日韩av在线| 91视频-88av| 免费91麻豆精品国产自产在线观看| 亚洲午夜未满十八勿入免费观看全集| 亚洲xxxx妇黄裸体| 亚洲精品自拍第一页| 亚洲成人久久久| 日韩av一区在线| 色偷偷综合社区| 成人网页在线免费观看| 日韩在线激情视频| 久久69精品久久久久久久电影好| 亚洲综合国产精品| 国产一区二区丝袜高跟鞋图片| 韩国视频理论视频久久| 国产欧美日韩精品专区| 亚洲嫩模很污视频| 亚洲va欧美va国产综合久久| 日韩不卡在线观看| 精品国产福利在线| 欧美激情精品久久久久久大尺度| 亚洲国产精品va在线观看黑人| 日韩乱码在线视频| 亚洲高清一区二| 久久天天躁日日躁| 美女av一区二区三区| 国产综合福利在线| 日韩电影免费在线观看| 久久免费视频网站| 久久人人爽国产| 亚洲aⅴ日韩av电影在线观看| www.亚洲成人| 亚洲成人在线视频播放| 国产精品午夜国产小视频| 日韩欧美在线中文字幕| 揄拍成人国产精品视频| 国产精品户外野外| 亚洲区中文字幕| 成人久久久久爱| 一区二区亚洲欧洲国产日韩| 综合网日日天干夜夜久久| 欧美日韩国产91| 97精品一区二区三区| 国产女人18毛片水18精品| 亚洲毛片一区二区| 日韩网站在线观看| 欧美激情一区二区三区高清视频| 日韩中文字幕在线播放| 亚洲高清一二三区| 亚洲成人久久电影| 日韩欧美精品中文字幕| 伊人久久久久久久久久久久久| 国产一区二区三区精品久久久| 97色在线视频观看| 亚洲国产精品久久久| 成人网页在线免费观看| 欧美壮男野外gaytube| 日本欧美在线视频| 欧美网站在线观看| 亚洲最大av在线| 成人免费在线网址| 亚洲老板91色精品久久| 两个人的视频www国产精品| 97免费中文视频在线观看| 国产精品成人va在线观看| 日韩专区中文字幕| 97在线看免费观看视频在线观看| 97香蕉超级碰碰久久免费软件| 91国内在线视频| 久热国产精品视频| 欧美日韩国产综合新一区| 成人激情视频网| 日产精品99久久久久久| 欧美一级淫片播放口| 国产日韩欧美黄色| 亚洲免费av片| 亚洲欧美日韩在线一区| 在线观看国产成人av片| 亚洲欧美中文日韩在线v日本| 久久综合色影院| 这里精品视频免费| 91av在线不卡| 精品少妇一区二区30p|