IN Memory Oltp 哈希索引与非聚集索引

IN Memory Oltp hash index vs non clustered

SQL 2014 memory tables 支持两种类型的索引,hash non clustered,non clustered.Since memory optimized tables are not stored as rows,we need to have one index compulosary.Below is创建哈希索引的语法

CREATE TABLE dbo.sample_memoryoptimizedtable_Hash
(
 c1 int NOT NULL,
 c2 float NOT NULL,
 c3 decimal(10, 2) NOT NULL
CONSTRAINT PK_sample_memoryoptimizedtable_Hash **PRIMARY KEY NONCLUSTERED HASH**
(
 c1 
)WITH ( BUCKET_COUNT = 1024)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )
GO

上面的语句创建了一个散列索引并将相应的行存储到它们的桶中。桶包含指向数据内存地址的指针。

但是当我们创建以下定义的非聚簇索引时

CREATE TABLE dbo.sample_memoryoptimizedtable_Range
(
 c1 int NOT NULL,
 c2 float NOT NULL,
 c3 decimal(10, 2) NOT NULL
CONSTRAINT PK_sample_memoryoptimizedtable_Range PRIMARY KEY NONCLUSTERED 
(
 c1 ASC
) 
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )
GO

上面的索引是如何存储的,它存储为 B 树吗,因为这个索引没有散列和表,索引是在 startup.How SQL 存储数据时重新创建的。

以下是迄今为止最好的链接和我的分析。

http://www.mssqltips.com/sqlservertip/3099/understanding-sql-server-memoryoptimized-tables-hash-indexes/

您所指的 "non-clustered" 索引实际上是范围索引。 Hash和Range索引都是非聚集索引,内存中的OLTP表中没有"clustered"个索引(主键被强制实现为聚集哈希索引)。范围索引是通过修改后的 B 树实现的,您可以在 http://research.microsoft.com/pubs/193594/Hekaton%20-%20Sigmod2013%20final.pdf

的 sigmod 白皮书中阅读更多关于两者的底层细节