2010-01-13 2 views
1

Если я пытаюсь сжать каждую последнюю производительность из запроса, что влияет на использование этих типов индексов моими соединениями.SQL Server: как тип индекса влияет на производительность соединения?

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

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

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

+0

Было бы полезно иметь определение таблицы и соединение, которое вы пытаетесь сделать. Имена не имеют значения, но какие поля вы присоединяетесь, какие поля вы выбираете и размер каждого поля в таблице concerend будет влиять на ответ. –

+0

Я ищу общий ответ. Запрос очень специфичен и относится к очень ненормализованной базе данных. Но я отправлю его ниже в качестве ответа. – ctrlShiftBryan

ответ

1

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

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

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

1

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

Некластеризованные индексы повторяют включенные поля с указателем на строки, которые имеют это значение. Наличие индекса в столбцах, используемых в ваших объединениях, должно повысить производительность. Вы можете дополнительно оптимизировать, используя «включенные столбцы» в своем индексе - это дублирует информацию о строке непосредственно в индекс, что может снизить штраф за производительность при поиске самой строки для выполнения выбора.

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

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

1

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

Это создаст индекс spanning, означающий, что все поля, которые SQL должен выполнять, относятся к одному индексу.

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

кластерный индекс - будет означать таблицу будет скомпонованной в порядке, указанном в индексе, это означает, что вы получите лучшую производительность для выбора * из таблицы, где INDEXFIELD = 3. Если вы не выбираете много больших объемы данных пунктов это не требуется.

2

В дополнении к ответу Гарета Саула крошечная осветления:

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

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

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

Этот «указатель поиска является кластеризация ключ» функция была в SQL Server, начиная с версии 7, как Kim Tripp will explain in great detail here:

Что такое кластерный индекс?

В SQL Server 7.0 и выше внутренние зависимости от ключа кластеризации ИЗМЕНИТЬ. (Да, это важно знать, что все изменилось в 7.0 ... почему? Потому что есть еще некоторые люди, которые там не понимают, как Радикала изменений произошли во внутренних органах (WRT к кластеризации ключ) в SQL Server 7.0).

Что изменилось в том, что ключ кластеризации привыкает как значение «поиска» из некластеризованных индексов.

+0

Спасибо за разъяснение. Я предположил, что ссылка индекса была внутренней, независимой от используемого ключа кластеризации. Хорошо узнать что-то новое! –

+0

Исправлено при работе с индексом NC в таблице CL, но индекс NC в куче по-прежнему использует энергонезависимый идентификатор строки, а таблица затем использует указатели пересылки для перемещения записей. (И это относится к более поздним версиям SQL, 2005/2008, а не к предыдущим) – Andrew

+0

@Andrew: true, но вряд ли есть веская причина ** не ** иметь кластеризованный индекс - так что, вероятно, это скорее случай случай. И, насколько я знаю, это было в SQL Server 7 и выше - не только в 2005 году и выше. См. Запись в блоге Ким Триппа, где она упоминает об этом: http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx –

Смежные вопросы