索引會作為記憶體優化數據表的進入點。 從數據表讀取數據列需要索引才能在記憶體中尋找數據。
哈希索引由排列在陣列中的桶集合所組成。 哈希函式會將索引鍵對應至哈希索引中的對應貯體。 下圖顯示三個索引鍵,這些索引鍵會對應至哈希索引中的三個不同的貯體。 為了圖例目的,哈希函式名稱為 f(x)。
用於哈希索引的哈希函式具有下列特性:
SQL Server 有一個哈希函式,用於所有哈希索引。
哈希函式具有決定性。 相同的索引鍵一律會對應至哈希索引中的相同桶。
多個索引鍵可以對應至相同的哈希值區。
哈希函式是平衡的,這表示索引鍵值在哈希桶中的分佈通常遵循 Poisson 分布。
波氏分佈不是偶數分佈。 索引鍵值不會平均分散在哈希貯體中。 例如,n 個相異索引鍵的泊松分佈在 n 個哈希桶中會導致大約三分之一的空桶,三分之一的桶含有一個索引鍵,另有三分之一的桶含有兩個索引鍵。 少量貯體將包含兩個以上的索引鍵。
如果兩個索引鍵對應至相同的哈希值區,則發生哈希衝突。 大量的哈希衝突可能會對讀取作業造成效能影響。
記憶體內部哈希索引結構是由記憶體指標陣列所組成。 每個桶對應到此陣列中的一個位移。 陣列中的每個貯體都會指向該哈希貯體中的第一個數據列。 貯體中的每個數據列都指向下一個數據列,因此導致每個哈希貯體的數據列鏈結,如下圖所示。
此圖有三個桶,並排列成行。 頂端的第二個桶子包含三個紅色的列。 第四個桶包含單一藍色行。 底部的桶子包含兩排綠色的行。 這些可能是相同數據列的不同版本。
如需記憶體優化數據表索引的詳細資訊,請參閱 在 Memory-Optimized 數據表上使用索引的指導方針。