基于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部分)。主要缘由是要作内存地址对齐。ide
行从堆中分配,此堆与彼堆不一样(相对于传统的基于磁盘的表)spa
行与行之间不局限于在同一个表的页范围内,而是经过表的“索引”来进行关联。因此,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字节 | |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
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 )。那么对于张3、李四两个值,他们的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还未提供,我了个擦。