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


Пример места на диске для индекса

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

В этом примере будут определены потребности в месте на диске для создания кластеризованного индекса.

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

  • Существующая таблица (куча) содержит 1 миллион строк. Длина каждой строки составляет 200 байт.

  • Некластеризованный индекс А содержит 1 миллион строк. Длина каждой строки составляет 50 байт.

  • Некластеризованный индекс В содержит 1 миллион строк. Длина каждой строки составляет 80 байт.

  • Параметру «index create memory» присвоено значение 2 МБ.

  • Для всех существующих и новых индексов используется значение коэффициента заполнения, равное 80. Это означает, что страницы заполнены на 80%.

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

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

Вычисление места на диске для автономных операций с индексами

Следующие шаги служат для вычисления как временного места на диске для использования во время индексной операции, так и постоянного места для хранения новых индексов. Приведенные вычисления приблизительны: результаты округляются и учитывают только размер конечного уровня индекса. Тильда (~) используется чтобы отметить приблизительные вычисления.

  1. Определите размер существующих (исходных) структур.

    Куча: 1 миллион * 200 байт ~ 200 МБ

    Некластеризованный индекс А: 1 миллион * 50 байт / 80% ~ 63 МБ

    Некластеризованный индекс Б: 1 миллион * 80 байт / 80% ~ 100 МБ

    Общий размер существующих структур: 363 МБ

  2. Определите размер новых (целевых) структур индексов. Предположим, что новый кластеризованный ключ имеет длину 24 байта, включая uniqueifier. Признак строк (длиной 8 байт) в обоих некластеризованных индексах будет заменен этим кластеризованным ключом.

    Кластеризованный индекс: 1 миллион * 200 байт / 80% ~ 250 МБ

    Некластеризованный индекс А: 1 миллион * (50 – 8 + 24) байт / 80% ~ 83 МБ

    Некластеризованный индекс Б: 1 миллион * (80 – 8 + 24) байт / 80% ~ 120 МБ

    Общий размер новых структур: 453 МБ

    Полное место на диске, необходимое для поддержки и исходных, и целевых структур в процессе операции с индексами, составляет 816 МБ (363 + 453). Место, выделенное под исходные структуры, будет освобождено после фиксации операции с индексами.

  3. Определите дополнительное временное место на диске для сортировки.

    Потребность в дисковом пространстве показана для сортировки в базе данных tempdb (с параметром SORT_IN_TEMPDB, установленным в ON) и сортировки в целевом местоположении (с параметром SORT_IN_TEMPDB, установленным в OFF).

    1. Когда параметр SORT_IN_TEMPDB установлен в ON, база данных tempdb должна иметь достаточно места на диске, чтобы хранить наибольший индекс (1 миллион * 200 байт ~ 200 МБ). Коэффициент заполнения в операции сортировки не учитывается.

      Дополнительное место на диске (в расположении базы данных tempdb), равное значению параметра index create memory = 2 МБ.

      Общий размер временного места на диске с параметром SORT_IN_TEMPDB, установленным в ON ~ 202 МБ.

    2. Когда параметру SORT_IN_TEMPDB присвоено значение OFF (значение по умолчанию), 250 МБ места на диске, уже предназначенные для нового индекса на шаге 2, используются для сортировки.

      Дополнительное место на диске (в целевом расположении), равное значению параметра index create memory = 2 МБ.

      Общий размер временного места на диске с параметром SORT_IN_TEMPDB, установленным в OFF = 2 МБ.

При использовании базы данных tempdb потребуется всего 1018 МБ (816 + 202), чтобы создать кластеризованные и некластеризованные индексы. Хотя использование базы данных tempdb увеличивает количество временного места на диске, которое используется для создания индекса, оно может уменьшить время создания индекса, если база данных tempdb и пользовательская база данных находятся на разных наборах дисков. Дополнительные сведения об использовании базы данных tempdb см. в разделе База данных tempdb и создание индекса.

Без использования базы данных tempdb для создания кластеризованных и некластеризованных индексов потребуется всего 818 МБ (2 + 816).

Вычисление места на диске для фоновых операций с кластеризованными индексами

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

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

  • Определите место для временного индекса сопоставления.

    В этом примере старая закладка — это идентификатор строки (RID) кучи (8 байт), а новая — ключ кластеризации (24 байта, включая uniqueifier). У старой и новой закладок нет пересекающихся столбцов.

    Размер временного индекса сопоставления = 1 миллион * (8 + 24 байта) / 80% ~ 40 МБ.

    Такой объем надо прибавить к месту, нужному в целевом расположении, если параметр SORT_IN_TEMPDB установлен в OFF, или к базе данных tempdb, если параметр SORT_IN_TEMPDB установлен в ON.

Дополнительные сведения о временном индексе сопоставления см. в разделе Требования к месту на диске для DDL-операций индекса.

Сводка по определению потребности в месте на диске

В следующей таблице подведены итоги вычислений места на диске.

Операция с индексами

Требования к месту на диске для местоположений следующих структур

Автономная операция с индексами при SORT_IN_TEMPDB = ON

Общий объем занятого места во время операции: 1018 МБ

  • Существующая таблица и индексы: 363 МБ*

  • tempdb: 202 МБ*

  • Новые индексы: 453 МБ

Общий объем занятого места после операции: 453 МБ

Автономная операция с индексами при SORT_IN_TEMPDB = OFF

Общий объем занятого места во время операции: 816 МБ

  • Существующая таблица и индексы: 363 МБ*

  • Новые индексы: 453 МБ

Общий объем занятого места после операции: 453 МБ

Операция с индексами в оперативном режиме при SORT_IN_TEMPDB = ON

Общий объем занятого места во время операции: 1058 МБ

  • Существующая таблица и индексы: 363 МБ*

  • tempdb (включая индекс сопоставления): 242 МБ*

  • Новые индексы: 453 МБ

Общий объем занятого места после операции: 453 МБ

Операция с индексами в оперативном режиме при SORT_IN_TEMPDB = OFF

Общий объем занятого места во время операции: 856 МБ

  • Существующая таблица и индексы: 363 МБ*

  • Временный индекс сопоставления: 40 МБ*

  • Новые индексы: 453 МБ

Общий объем занятого места после операции: 453 МБ

*Это место освобождается после того, как операция с индексами зафиксирована.

Этот пример не учитывает никаких дополнительных требований к дисковому пространству в базе данных tempdb для записи версий, созданных параллельными операциями обновления или удаления, осуществляемыми пользователем. Дополнительные сведения см. в разделе Основные сведения об уровнях изоляции на основе управления версиями строк.