SQL 2014 in-memory中的storage部分

鞠強發表於2013-10-22

基於CTP1的官方白皮書,自己理解的內容。白皮書下載地址:http://download.microsoft.com/download/F/5/0/F5096A71-3C31-4E9F-864E-A6D097A64805/SQL_Server_Hekaton_CTP1_White_Paper.pdf

 

  1. Memory-Optimized表的儲存,不再基於page,也不再從extents中分配(相比較而言,可以看Inside SQL系列中的Storage Engine部分)。主要原因是要做記憶體地址對齊。

  2. 行從堆中分配,此堆與彼堆不同(相對於傳統的基於磁碟的表)

  3. 行與行之間不侷限於在同一個表的頁範圍內,而是通過表的“索引”來進行關聯。所以,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位元組 |                                              |

    |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

2Rowheader的結構

    1. Header包含2個8位元組的時間戳。Begin-TS是行插入時的transaction的時間戳,End-TS是行刪除時的transaction的時間戳。對於還沒有被刪除的行,End-TS的值是”infinity”。

    2. Header包含一個4位元組長的statement ID。Transaction中的每個statement都包含一個唯一的StmtId值,第一次建立行時,該值被建立。

    3. Header包含一個2位元組長的idxLinkCount,表明有多少個索引,與當前這個行link了。

    4. Header包含一系列8位元組長的索引指標

    3PayLoad的結構

    1. Payload包含了行的資料:索引列+其他列。所以,相對於disk-based表,行就是資料,行就是索引,沒有單獨的索引page及data page。

    4Hash Indexes

    1. Hash Indexes,每個hash index指向一個指標陣列,陣列中每個成員稱之為hash bucket。每個memory-optimized表,最多可以包含8個索引。行上的每個索引列,都有一個hash方法進行支援,該方法決定了該行應該使用哪一個bucket進行操作。索引列中包含的相同值,對都應同一個hash值。比如表A有一個列叫做Name,另外一個列叫做City,Name列是索引列,對應的hash方法是length( name )。那麼對於張三、李四兩個值,他們的hash value都是2,都在同一個chain上。

    2. 當表為空時,插入一行,{name=張三, city=北京},那麼此時的value chain存在一個數值,值為strlen(張三)=2,,如上圖的pointer 1值為null(因為此時沒有其他行)

    3. 插入第二行,{name=李四,city=上海},由於strlen(李四)依然等於2,那麼上圖的pointer 1指向了上面的張三那行

    4. 建立第二個索引在City上,此時,每個行都包含了兩個索引。

    5. 建立hash index時,必須要制定bucket的數目,建議值是該表中該索引列唯一值的個數。這個數字,會向上與2的指數冪靠齊。如10000,會對齊到16384,50000對齊到65536。(如果行數增加,bucket不夠,怎麼辦?)

    5Range indexes

             如果不確定有多少個bucket需要建立,或者需要進行範圍搜尋,那麼需要建立Range indexes。但是CTP1還未提供,我了個擦。

    相關文章