hash函數編輯
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
哈希索引
SQL Server 2014
<?XML:NAMESPACE PREFIX = "[default] http://www.w3.org/1999/xhtml" NS = "http://www.w3.org/1999/xhtml" />索引用作內存優化表的入口點。 從表讀取行需要借助索引在內存中定位數據。
哈希索引包含以數組形式組織的 Bucket 集合。 哈希函數將索引鍵映射到哈希索引中對應的 Bucket。 下圖展示映射到哈希索引中三個不同 Bucket 的三個索引鍵。 出於演示目的,哈希函數的名稱為 f(x)。
用於哈希索引的哈希函數具有以下特征:
-
SQL Server 擁有一個用於所有哈希索引的哈希函數。
-
哈希函數具有確定性。 同一索引鍵始終映射到哈希索引中的同一 Bucket。
-
多個索引鍵可能映射到同一個哈希 Bucket。
-
哈希函數經過均衡處理,這意味着索引鍵值在哈希桶上的分布通常符合泊松分布。
泊松分布並非均勻分布。 索引鍵值並非均勻地分布在哈希 Bucket中。 例如,n 個不同索引鍵在 n 個哈希桶上的泊松分布導致約三分之一為空桶,三分之一的桶包含一個索引鍵,另外三分之一包含兩個索引鍵。 少量 Bucket 將包含兩個以上的鍵。
如果兩個索引鍵映射到同一個哈希 Bucket,則產生哈希沖突。 大量哈希沖突可影響讀取操作的性能。
內存哈希索引結構包含一個內存指針數組。 每個 Bucket 映射到該數組中的一個偏移位置。 數組中的每個 Bucket 指向該哈希 Bucket 中的第一行。 Bucket 中的每行指向下行,因而形成了每個哈希 Bucket 的行鏈,如下圖所示。
該圖有三個包含行的 Bucket。 頂部的第二個 Bucket 包含三個紅色行。 第四個 Bucket 包含一個藍色行。 底部的 Bucket 包含兩個綠色行。 這些可能是同一行的不同版本。
有關內存優化表的索引的詳細信息,請參閱在內存優化表上使用索引的指導原則。