基於CTP1的官方白皮書,自己理解的內容。白皮書下載地址:http://download.microsoft.com/download/F/5/0/F5096A71-3C31-4E9F-864E-A6D097A64805/SQL_Server_Hekaton_CTP1_White_Paper.pdf
-
Memory-Optimized表的儲存,不再基於page,也不再從extents中分配(相比較而言,可以看Inside SQL系列中的Storage Engine部分)。主要原因是要做記憶體地址對齊。
-
行從堆中分配,此堆與彼堆不同(相對於傳統的基於磁碟的表)
-
行與行之間不侷限於在同一個表的頁範圍內,而是通過表的“索引”來進行關聯。所以,Memory-Optimized表,至少要有一個索引。從這個角度講,索引把表中的行串聯了起來
表中行的結構
-
分為Row header及Pay load
結構如下
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|Row Header | PayLoad |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|Begin TS| End TS| StamtId| IdxLinkCount|pointer 1|pointer 2|---|Pointer N| |
|8位元組 |8位元組|4位元組 |2位元組 |8位元組 |8位元組 |…|8位元組 | |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
2、Rowheader的結構
-
Header包含2個8位元組的時間戳。Begin-TS是行插入時的transaction的時間戳,End-TS是行刪除時的transaction的時間戳。對於還沒有被刪除的行,End-TS的值是”infinity”。
-
Header包含一個4位元組長的statement ID。Transaction中的每個statement都包含一個唯一的StmtId值,第一次建立行時,該值被建立。
-
Header包含一個2位元組長的idxLinkCount,表明有多少個索引,與當前這個行link了。
-
Header包含一系列8位元組長的索引指標
3、PayLoad的結構
-
Payload包含了行的資料:索引列+其他列。所以,相對於disk-based表,行就是資料,行就是索引,沒有單獨的索引page及data page。
4、Hash Indexes
-
Hash Indexes,每個hash index指向一個指標陣列,陣列中每個成員稱之為hash bucket。每個memory-optimized表,最多可以包含8個索引。行上的每個索引列,都有一個hash方法進行支援,該方法決定了該行應該使用哪一個bucket進行操作。索引列中包含的相同值,對都應同一個hash值。比如表A有一個列叫做Name,另外一個列叫做City,Name列是索引列,對應的hash方法是length( name )。那麼對於張三、李四兩個值,他們的hash value都是2,都在同一個chain上。
-
當表為空時,插入一行,{name=張三, city=北京},那麼此時的value chain存在一個數值,值為strlen(張三)=2,,如上圖的pointer 1值為null(因為此時沒有其他行)
-
插入第二行,{name=李四,city=上海},由於strlen(李四)依然等於2,那麼上圖的pointer 1指向了上面的張三那行
-
建立第二個索引在City上,此時,每個行都包含了兩個索引。
-
建立hash index時,必須要制定bucket的數目,建議值是該表中該索引列唯一值的個數。這個數字,會向上與2的指數冪靠齊。如10000,會對齊到16384,50000對齊到65536。(如果行數增加,bucket不夠,怎麼辦?)
5、Range indexes
如果不確定有多少個bucket需要建立,或者需要進行範圍搜尋,那麼需要建立Range indexes。但是CTP1還未提供,我了個擦。