Хэш-индексы

Индексы используются в качестве точек входа для оптимизированных для памяти таблиц. Для чтения строк из таблицы требуется индекс для поиска данных в памяти.

Хэш-индекс состоит из коллекции контейнеров, организованных в массиве. Хэш-функция сопоставляет ключи индекса с соответствующими контейнерами в хэш-индексе. На следующем рисунке показаны три ключа индекса, сопоставленные с тремя разными контейнерами в хэш-индексе. Для иллюстрации имя хэш-функции — f(x).

Ключи индекса, сопоставленные с различными контейнерами.

Функция хэширования, используемая для хэш-индексов, имеет следующие характеристики:

  • SQL Server имеет одну хэш-функцию, используемую для всех хэш-индексов.

  • Хэш-функция детерминирована. Один и тот же ключ индекса всегда сопоставляется с тем же контейнером в хэш-индексе.

  • Несколько ключей индекса могут быть сопоставлены с тем же хэш-контейнером.

  • Хэш-функция сбалансирована, то есть распределение значений ключа индекса по хэш-контейнерам обычно следует распределению Poisson.

    Распределение Пуассона не является равномерным распределением. Значения ключа индекса равномерно не распределяются в хэш-контейнерах. Например, распределение Пуассона n различных ключей индекса по n хэш-кувшинам приводит к тому, что приблизительно одна треть кувшинов остается пустой, одна треть содержит один ключ индекса, а другая треть - два ключа индекса. Небольшое количество контейнеров будет содержать более двух ключей.

Если два ключа индекса сопоставлены с тем же хэш-ведром, возникает хэш-коллизия. Большое количество хэш-конфликтов может повлиять на производительность операций чтения.

Структура хэш-индекса в памяти состоит из массива указателей памяти. Каждый контейнер сопоставляется со смещением в этом массиве. Каждый контейнер в массиве указывает на первую строку в этом хэш-контейнере. Каждая строка в контейнере указывает на следующую строку, что приводит к цепочке строк для каждого хэш-контейнера, как показано на следующем рисунке.

Структура хэш-индекса в памяти.

На рисунке есть три ведра с рядами. Второе ведро сверху содержит три красные строки. Четвертый контейнер содержит одну синюю строку. Нижний контейнер содержит две зеленые строки. Они могут быть различными версиями одной строки.

Дополнительные сведения об индексах для таблиц, оптимизированных для памяти, см. в руководстве по использованию индексов в таблицах Memory-Optimized.

См. также

Индексы в таблицах Memory-Optimized