SQL 2014 in-memory中的storage部分

基於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部分)。主要緣由是要作內存地址對齊。ide

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

  3. 行與行之間不侷限於在同一個表的頁範圍內,而是經過表的「索引」來進行關聯。因此,Memory-Optimized表,至少要有一個索引。從這個角度講,索引把表中的行串聯了起來指針

 

表中行的結構索引

  • 分爲Row header及Pay load內存

    結構以下ci

    |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|get

    |Row Header                                                  |      PayLoad                                 |hash

    |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|it

    |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 )。那麼對於張3、李四兩個值,他們的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還未提供,我了個擦。

相關文章
相關標籤/搜索