文章出處

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


    文章列表




    Avast logo

    Avast 防毒軟體已檢查此封電子郵件的病毒。
    www.avast.com


    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()