哈希索引

索引用作内存优化表的入口点。 从表读取行需要借助索引在内存中定位数据。

哈希索引包含以数组形式组织的 Bucket 集合。 哈希函数将索引键映射到哈希索引中对应的 Bucket。 下图展示映射到哈希索引中三个不同 Bucket 的三个索引键。 出于演示目的,哈希函数的名称为 f(x)。

映射到不同存储桶的索引键。

用于哈希索引的哈希函数具有以下特征:

  • SQL Server有一个用于所有哈希索引的哈希函数。

  • 哈希函数具有确定性。 同一索引键始终映射到哈希索引中的同一 Bucket。

  • 多个索引键可能映射到同一个哈希 Bucket。

  • 哈希函数经过均衡处理,这意味着索引键值在哈希桶上的分布通常符合泊松分布。

    泊松分布并非均匀分布。 索引键值并非均匀地分布在哈希 Bucket中。 例如,在 n 个哈希桶上,n 个不同索引键的 Poisson 分布导致大约三分之一的空存储桶,三分之一的存储桶包含一个索引键,另外三分之一包含两个索引键。 少量 Bucket 将包含两个以上的键。

如果两个索引键映射到同一个哈希 Bucket,则产生哈希冲突。 大量哈希冲突可影响读取操作的性能。

内存哈希索引结构包含一个内存指针数组。 每个 Bucket 映射到该数组中的一个偏移位置。 数组中的每个 Bucket 指向该哈希 Bucket 中的第一行。 Bucket 中的每行指向下行,因而形成了每个哈希 Bucket 的行链,如下图所示。

内存中哈希索引结构。

该图有三个包含行的 Bucket。 顶部的第二个 Bucket 包含三个红色行。 第四个 Bucket 包含一个蓝色行。 底部的 Bucket 包含两个绿色行。 这些可能是同一行的不同版本。

有关内存优化表的索引的详细信息,请参阅对 Memory-Optimized表使用索引的准则

另请参阅

内存优化表上的索引