Подтвердить что ты не робот

Должна ли каждая таблица пользователей иметь кластерный индекс?

Недавно я нашел пару таблиц в базе данных без определенных кластеризованных индексов. Но существуют некластеризованные индексы, поэтому они находятся в HEAP.

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

Не наличие кластерного индекса в этих таблицах влияет на производительность?

4b9b3361

Ответ 1

Сложно сказать это более кратко, чем SQL Server MVP Брэд МакГие:

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

BOL отражает это чувство:

За небольшим исключением каждая таблица должна иметь кластеризованный индекс.

Причины этого очень много и основаны прежде всего на том факте, что кластерный индекс физически заказывает ваши данные в хранилище.

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

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

  • Кластеризованный индекс часто позволяет принимать эффективные запросы по столбцам, которые часто ищут диапазоны значений (between, > и т.д.).

  • Кластеризация может ускорять запросы, когда данные обычно сортируются по определенному столбцу или столбцам.

  • Кластеризованный индекс может быть перестроен или реорганизован по требованию для управления фрагментацией таблицы.

  • Эти преимущества могут быть применимы к представлениям.

Возможно, вам не нужен кластеризованный индекс:

  • Столбцы с частыми изменениями данных, поскольку SQL Server должен затем физически переупорядочить данные в хранилище.

  • Столбцы, которые уже охвачены другими индексами.

  • Широкие клавиши, поскольку кластерный индекс также используется в некластеризованных индексах.

  • Графы GUID, которые больше тождеств, а также эффективные случайные значения (вряд ли будут отсортированы), хотя newsequentialid() может использоваться для смягчения физического переупорядочения во время вставок.

  • Редкая причина использования heap (таблица без кластерного индекса) заключается в том, что к данным всегда обращаются через некластеризованные индексы и Известно, что идентификатор RID (внутренний идентификатор строки SQL) меньше, чем кластерный индексный ключ.

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

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

Ответ 2

Да, вы должны иметь кластерный индекс в таблице. Так что все некластеризованные индексы работают лучше.

Ответ 3

Производительность - большая волосатая проблема. Убедитесь, что вы оптимизируете правильную вещь.

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

Целью индекса является поиск совпадающих строк и получение данных при поиске.

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

Если кластерный индекс отсутствует, SQL использует внутреннюю строкуInd для указания местоположения данных.

Однако, если в таблице есть кластерный индекс, этот rowId заменяется значениями данных в кластерном индексе.

Таким образом, шаг чтения данных строк не понадобится и будет покрываться значениями в индексе.

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

Ответ 4

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

Лучше всего разместить кластеризованный индекс на столбцах, который часто искал диапазон значений. Пример - это диапазон дат. Кластеризованные индексы также эффективны для поиска определенной строки, когда индексированное значение уникально. Microsoft SQL поместит кластерные индексы в ограничение PRIMARY KEY автоматически, если не определены кластерные индексы.

Кластеризованные индексы не являются хорошим выбором для:

Столбцы, которые часто меняются

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

Широкие клавиши

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

Ответ 5

Я бы не сказал: "Каждая таблица должна иметь кластеризованный индекс", я бы сказал: "Посмотрите внимательно на каждую таблицу и на то, как к ней обращаются, и попытайтесь определить кластеризованный индекс на ней, если это имеет смысл". Это плюс, как Joker, у вас есть только один Joker за стол, но вам не нужно его использовать. Другие системы баз данных не имеют этого, по крайней мере в этой форме, BTW.

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

Итак, прочитайте исключения и причины Тима Леннера.

Ответ 6

Рассмотрите возможность использования clustered index в столбцах, содержащих большое количество различных значений , поэтому, чтобы SQL Server не добавлял "уникальный идентификатор" для дублирования значений ключей

Недостаток. Требуется больше времени для обновления записей, если только при изменении полей в индексе кластеризации.

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

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