Как знать, когда использовать индексы и которые вводят?

Я искал немного и не видел подобного вопроса, таким образом, здесь идет.

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

Может индекс когда-либо замедлять производительность select операторы? Сколько индексов слишком многие и как большой из таблицы Вам нужно, чтобы она извлекла выгоду из индекса?

Править:

Что относительно типов данных столбца? Это в порядке, чтобы иметь индекс на a varchar или datetime?

8
задан Earlz 9 March 2010 в 22:00
поделиться

6 ответов

Итак, первый вопрос прост:

Когда следует использовать кластерный индекс?

Всегда. Период. За исключением очень немногих редких крайних случаев. Кластерный индекс ускоряет работу таблицы при каждой операции. ДА! Оно делает. См. Превосходную Ким Триппа. Продолжение дебатов по кластерному индексу для получения справочной информации. Она также упоминает свои основные критерии для кластерного индекса:

  • узкий
  • статический (никогда не меняется)
  • уникальный
  • , если когда-либо возможно: когда-либо возрастающий

INT IDENTITY полностью соответствует этому, а GUID - нет. См. GUID в качестве первичного ключа для более подробной информации.

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

Почему уникальный ?? См. Выше - ключ кластеризации - это элемент и механизм, которые SQL Server использует для однозначного поиска строки данных . Он должен быть уникальным. Если вы выберете неуникальный ключ кластеризации, SQL Server сам добавит к вашим ключам 4-байтовый уникальный определитель.Остерегайтесь этого!

Далее: некластеризованные индексы. По сути, есть одно правило: любой внешний ключ в дочерней таблице, ссылающийся на другую таблицу, должен быть проиндексирован, это ускорит JOINs и другие операции.

Кроме того, любые запросы, содержащие предложения WHERE, являются хорошим кандидатом - сначала выберите те, которые выполняются часто. Поместите индексы в столбцы, которые отображаются в предложениях WHERE, в операторах ORDER BY.

Далее: измерьте свою систему, проверьте DMV (динамические представления управления) на предмет подсказок о неиспользуемых или отсутствующих индексах и настройте свою систему снова и снова. Это непрерывный процесс, вы никогда не закончите! См. здесь для информации об этих двух DMV (отсутствующие и неиспользуемые индексы).

Еще одно предупреждение: при большом количестве индексов любой запрос SELECT может выполняться очень быстро. Но в то же время могут пострадать операции INSERT, UPDATE и DELETE, которые должны обновлять все задействованные индексы. Если вы только когда-либо ВЫБИРАЕТЕ - сходите с ума! В противном случае это прекрасный и тонкий баланс. Вы всегда можете настроить один-единственный запрос невероятно, но остальная часть вашей системы может пострадать при этом. Не чрезмерно индексируйте свою базу данных! Установите несколько хороших индексов, проверьте и понаблюдайте, как ведет себя система, а затем, возможно, добавьте еще один или два, и снова: понаблюдайте, как это влияет на общую производительность системы.

3
ответ дан 5 December 2019 в 23:14
поделиться

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

Общее правило добавления индексов состоит в том, если вам нужно найти данные в таблице, используя определенное поле или набор полей. Это приводит к тому, сколько индексов слишком много, как правило, чем больше у вас индексов, тем медленнее будут вставки и обновления, поскольку они также должны изменять индексы, но все зависит от того, как вы используете свои данные. Если вам нужны быстрые вставки, не используйте их слишком много. В отчетах о хранилищах данных типа «только для чтения» их может быть несколько, чтобы ускорить поиск.

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

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

1
ответ дан 5 December 2019 в 23:14
поделиться

Wenn Sie eine Abfrage basierend auf dem Wert in einer Spalte erstellen, möchten Sie diese Spalte wahrscheinlich indizieren.

d.h.

SELECT a,b,c FROM MyTable WHERE x = 1

Sie würden einen Index auf X wünschen.

Im Allgemeinen füge ich Indizes für Spalten hinzu, die häufig abgefragt werden, und ich füge zusammengesetzte Indizes hinzu, wenn ich mehr als eine Spalte abfrage.

Indizes beeinträchtigen die Leistung eines SELECT nicht, aber sie können INSERTS (oder UPDATES) verlangsamen, wenn Sie zu viele Indexspalten pro Tabelle haben.

Als Faustregel gilt: Beginnen Sie mit dem Hinzufügen von Indizes, wenn Sie WO a = 123 sagen (in diesem Fall ein Index für "a").

0
ответ дан 5 December 2019 в 23:14
поделиться

Sie sollten einen Index für Spalten verwenden, die Sie für die Auswahl und Reihenfolge verwenden - d. h. die Where- und ORDER BY-Klauseln.

Индексы могут замедлять операторы select, если их много, и вы используете WHERE и ORDER BY для столбцов, которые не были проиндексированы.

Что касается размера таблицы - несколько тысяч строк и выше начнут показывать реальные преимущества использования индекса.

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

0
ответ дан 5 December 2019 в 23:14
поделиться

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

Есть еще кое-что, но вы могли бы сделать хуже, чем использование недостающего индекса DMV

SQL Server. Индекс может замедлить выполнение SELECT, если оптимизатор сделает неправильный выбор, и возможно их слишком много. Слишком много будет медленной записи, но также возможно перекрытие индексов

1
ответ дан 5 December 2019 в 23:14
поделиться

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

0
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: