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

首頁 > 開發 > 綜合 > 正文

解剖SQLSERVER 第十三篇 Integers在行壓縮和頁壓縮里的存儲格式揭秘(譯)

2024-07-21 02:48:55
字體:
來源:轉載
供稿:網友
解剖SQLSERVER 第十三篇 Integers在行壓縮和頁壓縮里的存儲格式揭秘(譯)解剖SQLSERVER 第十三篇 Integers在行壓縮和頁壓縮里的存儲格式揭秘(譯)

http://imPRove.dk/the-anatomy-of-row-amp-page-compressed-integers/

當解決OrcaMDF對行壓縮的支持的時候,視圖解析整數的時候遇到了一些挑戰。

和正常的未壓縮整數存儲不同的是這些都是可變長度--這意味著1個整數的值50只占用1個字節,而不是通常的4個字節。

這些不是新功能了,大家可以看一下vardecimal他被存儲為可變長度。然而不同的是兩者存儲在磁盤上的數據的方式。

注意雖然我只是實現行壓縮,他跟頁面壓縮中使用的行壓縮是一樣的,并沒有區別

大家可以看一下《深入解析SQL Server 2008 筆記》里面有行壓縮和頁壓縮的詳細解釋

TinyintTinyint在壓縮后和壓縮前基本是一樣的(tinyint:從0到255的整數數據,存儲大小為 1 字節)只有一個例外情況,當數值是0的時候如果開啟了行壓縮將不占用任何字節,

如果是非壓縮存儲將會存儲0x0,并且占用一個字節。所有的整形類型(tinyint,smallint,int,bigint)對于0這個數值都是同等對待,數值由壓縮行元數據進行描述并且不存儲任何值

Smallint讓我們開始通過觀察正常的未壓縮的smallint數值, 對于 -2,-1,1,2這些值的存儲,0不會存儲任何東西。注意,所有這些值會準確的存放在磁盤上,在這種情況下他們使用小字節序來存儲

-2    =    0xFEFF-1    =    0xFFFF1    =    0x01002    =    0x0200

Little-Endian

從1,2 這兩個值開始,他們很直接很簡單的轉換為decimal和你想要的實際數值。然而,-1有點不一樣,顯示0xFEFF 將他轉換為decimal是65.535 --我們能存儲的最大的無符號整形值是2個字節,

SQLSERVER對于一個smallint 的范圍是–32768 to 32767

計算實際值依賴于所使用的整數溢出??纯聪旅娴腃#代碼片段:

unchecked{    Console.WriteLine(0 + (short)32767);    Console.WriteLine(0 + (short)32768);    Console.WriteLine(0 + (short)32769);    // ...    Console.WriteLine(0 + (short)65534);    Console.WriteLine(0 + (short)65535);}

輸出如下:

32767-32768-32767-2-1

如果我們這樣計算 0+有符號short的最大值,那么最大值就是有符號短整型 32767,很明顯負數就是-32767,

然而,如果我們這樣計算 0+32.768=32768,那么就會超出short的范圍,我們將最高位翻轉變成負數 -32768 卻不會溢出。

因為這些數都是常數,編譯器不允許溢出--除非我們將代碼封裝在uncheck {}section里面

你可能曾經聽過虛構的符號位。基本上它的最高位被用于指示一個數是正數還是負數。

從上面的例子應該很明顯的顯示符號位不是那么特別--通過查詢這個符號位決定一個給定的數的符號。看一下當溢出的時候符號位會怎樣

32767    =    0b0111111111111111-32768    =    0b1000000000000000-32767    =    0b1000000000000001

對于由于太大而引起溢出的數字,最高位“sign bit”需要進行設置。這不神奇,它只是用來引起溢出。

那么,我們有一些背景知識知道一個常規的非壓縮integers 是如何存儲的?,F在看一下那些同樣數值的smallint 是如何存儲在行壓縮表里的

-2    =    0x7E-1    =    0x7F1    =    0x812    =    0x82

讓我們嘗試將這些值轉換為decimal,我做如下轉換

-2    =    0x7E    =    -128 + 126-1    =    0x7F    =    -128 + 1271    =    0x81    =    -128 + 1292    =    0x82    =    -128 + 130

很明顯,這些值會以另一種方式進行存儲。最明顯的不同是我們現在只使用一個字節--由于變成了可變長度存儲。當我們解析這些值的時候,我們需要簡單的看一下這些數字的字節存儲。如果只使用一個字節,我們知道這表示0到255(對于tinyint來講) 或者對于smallint 數值是 -128到127 。當smallint 存儲的那個值范圍在-128到127 就會使用一個字節來存儲

如果我們使用相同的方法,我們明顯會獲得錯誤的結果 。1 <> 0 + 129 訣竅是在本例中將存儲的值作為無符號整數,然后最小值作為偏移量而不是使用0來作為偏移,我們將使用有符號 的一個字節最小值-128 作為偏移

-2    =    0x7E    =    -128 + 126-1    =    0x7F    =    -128 + 1271    =    0x81    =    -128 + 1292    =    0x82    =    -128 + 130

這意味著一旦我們超出有符號 的1個字節的范圍 我們將需要用2個字節來存儲,對嗎?

一個非常重要的區別是,非壓縮值會永遠使用小字節序來存儲,然而使用了行壓縮的整數值卻使用大字節序來存儲!所以,他們不只使用不同的偏移值,而使用不同的字節序。但是最終的結果都是相同的,不過計算方式卻有很大的不同

Int 和 bigint一旦我找到字節序的規律和行壓縮整型值的數值架構,int和bigint的實現就很簡單了。和其他類型一樣,他們也是可變長度的所以你有可能會碰到5字節長的bigint值和1字節長的int值。下面是SqlBigInt 類型的主要解析代碼

switch (value.Length){    case 0:        return 0;    case 1:        return (long)(-128 + value[0]);    case 2:        return (long)(-32768 + BitConverter.ToUInt16(new[] { value[1], value[0] }, 0));    case 3:        return (long)(-8388608 + BitConverter.ToUInt32(new byte[] { value[2], value[1], value[0], 0 }, 0));    case 4:        return (long)(-2147483648 + BitConverter.ToUInt32(new[] { value[3], value[2], value[1], value[0] }, 0));    case 5:        return (long)(-549755813888 + BitConverter.ToInt64(new byte[] { value[4], value[3], value[2], value[1], value[0], 0, 0, 0 }, 0));    case 6:        return (long)(-140737488355328 + BitConverter.ToInt64(new byte[] { value[5], value[4], value[3], value[2], value[1], value[0], 0, 0 }, 0));    case 7:        return (long)(-36028797018963968 + BitConverter.ToInt64(new byte[] { value[6], value[5], value[4], value[3], value[2], value[1], value[0], 0 }, 0));    case 8:        return (long)(-9223372036854775808 + BitConverter.ToInt64(new[] { value[7], value[6], value[5], value[4], value[3], value[2], value[1], value[0] }, 0));    default:        throw new ArgumentException("Invalid value length: " + value.Length);}

可變長度的值是一個包含字節數據的字節數組存儲在磁盤上。如果長度是0,沒有東西存儲因此我們知道他的值為0。

對于每一個剩余的有效長度,簡單的使用最小的顯示值作為偏移并且添加上存儲的值

對于非壓縮值我們可以使用BitConverter 類直接將輸入值使用系統字節序轉為期望值,對于大多數的英特爾和AMD系統,一般都是小字節序(意味著OrcaMDF 不會運行在一個大字節序的系統上)。然而,當壓縮值使用大字節序進行壓縮,我必須重新映射輸入的數組為小端字節格式,并且在字節尾補上0 以便匹配short,int和long的大小

對于shorts和ints 我將無符號數值讀取進來,因為這是我所感興趣的。工作原理是將int 和uint強制轉換為long值。我不能對long類型做同樣的事情因為沒有其他數據類型比long 更大了。對于long的最大值為9.223.372.036.854.775.807,在磁盤里實際存儲為0xFFFFFFFFFFFFFFFF。解析有符號long型使用BitConverter得出的結果 -1 由于會導致溢出。由于額外的負數溢出這有可能會導致出錯

-9.223.372.036.854.775.808 + 0xFFFFFFFFFFFFFF =>-9.223.372.036.854.775.808 + -1 =9.223.372.036.854.775.807

結論通常我有很多的有趣的嘗試通過執行一個select語句去找出數值在磁盤上以哪一個字節結束。這不會花很長的時間去實現,技術內幕的書只是作為引導,還有很多東西需要我們深入挖掘

第十三篇完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品www乱入免费视频| 国产亚洲日本欧美韩国| 久久天天躁狠狠躁夜夜av| 欧亚精品在线观看| 最近2019年好看中文字幕视频| 91精品久久久久久久久不口人| 亚洲精品自产拍| 亚洲最大av在线| 播播国产欧美激情| 亚洲第一精品夜夜躁人人爽| 在线播放日韩av| 日韩在线观看免费高清完整版| 中文字幕亚洲色图| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品一区二区三区毛片淫片| 夜夜嗨av色一区二区不卡| 欧美一级黑人aaaaaaa做受| 久久久久久久久网站| 日韩成人黄色av| 久久精品99久久香蕉国产色戒| 不卡毛片在线看| 日韩高清a**址| 久青草国产97香蕉在线视频| 亚洲精品免费av| 久久国产精品久久久久久| 欧洲一区二区视频| 国产做受高潮69| 性色av一区二区咪爱| 亚洲精品久久久久久久久久久久久| 国产一区红桃视频| 亚洲欧美精品一区二区| 久久香蕉国产线看观看网| 日韩成人小视频| 久久久亚洲天堂| 亚洲美女动态图120秒| 国产精品久久久久久久天堂| 亚洲欧洲国产伦综合| 成人激情黄色网| 中文字幕日韩欧美在线视频| 欧美小视频在线| 久久久亚洲精选| 亚洲第一视频网| 久久久免费精品视频| 国产欧美一区二区| 日韩小视频网址| 亚洲天堂精品在线| 欧美电影第一页| 国产精品福利网| 亚洲最大福利视频网站| 91免费精品国偷自产在线| 欧美激情久久久久| 精品国产欧美一区二区三区成人| www欧美xxxx| 欧美一性一乱一交一视频| 日韩高清电影好看的电视剧电影| 精品无人区太爽高潮在线播放| 成人午夜两性视频| 韩国日本不卡在线| 久久久精品国产一区二区| 中文字幕欧美视频在线| 欧美—级a级欧美特级ar全黄| 成人免费在线网址| 久久av资源网站| 欧美日韩国产限制| 欧美一区二区三区图| 亚洲第一视频网站| 欧美不卡视频一区发布| 亚洲成人精品视频| 欧美一区二区三区艳史| 高潮白浆女日韩av免费看| 91爱爱小视频k| 97香蕉超级碰碰久久免费软件| 午夜精品一区二区三区在线视频| 超碰精品一区二区三区乱码| 欧美激情手机在线视频| 性欧美在线看片a免费观看| 韩剧1988在线观看免费完整版| 欧美性猛交xxxx免费看漫画| 久久久久久一区二区三区| 国产精品欧美日韩久久| 日韩av电影手机在线| 成人国产精品一区二区| 538国产精品视频一区二区| 日韩一区二区三区在线播放| 欧美性开放视频| 国产精品青草久久久久福利99| 欧美一级高清免费| 伦伦影院午夜日韩欧美限制| 亚洲最大的网站| 九九久久久久99精品| 国产精品自产拍在线观看中文| 久久视频在线观看免费| 最近的2019中文字幕免费一页| 国产成人精品午夜| 久热在线中文字幕色999舞| 欧美午夜女人视频在线| 中文字幕日本欧美| 日韩中文字幕在线| 亚洲欧美国产精品久久久久久久| 正在播放欧美视频| 欧美裸体xxxx极品少妇| 亚洲欧美在线播放| 欧美一区三区三区高中清蜜桃| 69av在线视频| www.久久撸.com| 日韩欧美视频一区二区三区| 国产日韩欧美日韩大片| 91精品国产网站| 国产日本欧美一区| 5566日本婷婷色中文字幕97| 一区国产精品视频| 欧美理论在线观看| 宅男66日本亚洲欧美视频| 欧美日韩一区二区三区在线免费观看| 2020国产精品视频| 中文字幕久久久av一区| 成人激情电影一区二区| 97视频com| 亚洲人成绝费网站色www| 最新国产成人av网站网址麻豆| 国产精品久久久| 国产亚洲欧美日韩美女| 久久久精品国产亚洲| 国产精品久久久久久久久免费| 欧美壮男野外gaytube| 日韩成人中文字幕在线观看| 成年人精品视频| 97人人爽人人喊人人模波多| 九九热精品在线| 亚洲人成在线免费观看| 中文字幕欧美专区| 日韩在线不卡视频| 国模精品视频一区二区| 成人免费福利视频| 国产女同一区二区| 欧美极品少妇xxxxx| 日韩va亚洲va欧洲va国产| 精品久久久在线观看| 欧美成人精品一区| 91精品视频专区| 91久久久久久久一区二区| 国产成人97精品免费看片| 欧美电影免费观看电视剧大全| 成人做爰www免费看视频网站| 日韩精品在线免费播放| 日韩精品在线免费播放| 高清欧美性猛交xxxx黑人猛交| 欧美亚洲国产视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久成年人视频| 日韩专区在线播放| 色视频www在线播放国产成人| 7m精品福利视频导航| 欧美极品在线视频| 国自产精品手机在线观看视频| 91情侣偷在线精品国产| 中文字幕精品—区二区| 欧美黄色三级网站| 欧美成人激情视频| 国产精品偷伦一区二区| 亚洲一区二区国产| 成人日韩av在线| 国产在线观看精品一区二区三区| 欧美国产日韩一区二区三区|