基于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還未提供,我了個擦。
文章列表