Поделиться через


Правила проектирования кластеризованного индекса

Кластеризованные индексы сортируют и хранят строки данных в таблице, основываясь на их ключевых значениях. Может быть только один кластеризованный индекс на таблицу, потому что сами строки данных могут быть отсортированы только в одном порядке. Дополнительные сведения о кластеризованной индексной архитектуре см. в разделе Структуры кластеризованного индекса

За несколькими исключениями, каждая таблица должна иметь кластеризованный индекс, определенный по столбцу или столбцам и предлагающий следующее:

  • Может применяться для часто используемых запросов.

  • Обеспечивает высокую степень уникальности.

    ПримечаниеПримечание

    При создании ограничения PRIMARY KEY будет автоматически создан уникальный индекс по столбцу или столбцам. По умолчанию этот индекс кластеризован; однако при создании ограничения можно указать некластеризованный индекс.

  • Может использоваться в диапазонных запросах.

Если кластеризованный индекс создан не со свойством UNIQUE, компонент Database Engine автоматически добавляет 4-байтовый столбец uniqueifier к таблице. При необходимости компонент Database Engine автоматически добавляет значение uniqueifier к строке, чтобы сделать каждый ключ уникальным. Данный столбец и его значения используются внутри и недоступны пользователям для просмотра или использования.

Вопросы работы с запросами

Прежде чем создать кластеризованные индексы, необходимо понять, как будет происходить обращение к данным. Рассмотрим использование кластеризованного индекса для запросов, которые выполняют следующее:

  • Возвращают диапазон значений с помощью операторов, таких как BETWEEN, >, >=, < и <=.

    После того как строка с первым значением будет найдена с помощью кластеризованного индекса, строки с последующими индексированными значениями гарантированно окажутся физически смежными с этой строкой. Например, если запрос получает записи из диапазона порядковых номеров продаж, кластеризованный индекс по столбцу SalesOrderNumber может быстро определить расположение строки, содержащей стартовый порядковый номер продаж, и затем извлечь все последующие строки из таблицы, пока не будет достигнут последний порядковый номер продаж.

  • Возвращают большие результирующие наборы.

  • Используют предложения JOIN; обычно в них участвуют столбцы внешнего ключа.

  • Используют предложения ORDER BY или GROUP BY.

    Индекс по столбцам, указанным в предложении ORDER BY или GROUP BY, может исключить потребность в сортировке данных для компонента Database Engine, потому что строки будут уже отсортированы. Это улучшает производительность запроса.

Вопросы работы со столбцами

В общем случае надо так определить ключ кластеризованного индекса, чтобы в него вошло как можно меньше столбцов. Рассмотрите столбцы, которым присущ один или несколько следующих атрибутов:

  • Являются уникальными или содержат много различных значений.

    Например, идентификатор сотрудника уникально идентифицирует служащих. Кластеризованный индекс или ограничение PRIMARY KEY на столбец EmployeeID улучшило бы производительность запросов, которые производят поиск сведений о сотруднике, основываясь на номере идентификатора сотрудника. В качестве альтернативы кластеризованный индекс мог бы быть создан по столбцам LastName, FirstName и MiddleName, потому что записи сотрудников часто группируются и запрашиваются именно таким образом, так что сочетание этих столбцов обеспечивало бы высокую степень различия.

  • Обращение к ним происходит последовательно.

    Например, код продукта уникально идентифицирует продукты в таблице Production.Product в базе данных AdventureWorks. Запросы, в которых указан последовательный поиск, например WHERE ProductID BETWEEN 980 and 999, извлекут заметную выгоду из кластеризованного индекса по ProductID. Это происходит потому, что строки будут храниться в отсортированном порядке по этому ключевому столбцу.

  • Определены как IDENTITY, потому что такой столбец гарантирует уникальность в пределах таблицы.

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

    Это может служить хорошей идеей для кластеризации (которая по сути является физической сортировкой) таблицы по этому столбцу, потому что исключит затраты на сортировку при каждом запросе к столбцу.

Кластеризованные индексы — не лучший выбор для следующих атрибутов:

  • столбцов, которые подвергаются частым изменениям;

    Изменения вызывают перемещение целых строк, потому что компонент Database Engine должен сохранять значения данных строки в физическом порядке. Это важно при работе в крупномасштабных системах обработки транзакций, в которых данные обычно быстро меняются.

  • широких ключей.

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

Параметры индексов

Есть несколько параметров индекса, которые могут быть указаны при создании кластеризованного индекса. Поскольку кластеризованные индексы обычно являются весьма большими, необходимо обратить внимание на следующие параметры:

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

Дополнительные сведения см. в разделе Установка параметров индекса.