Имеет ли индекс с несколькими столбцами избыточный индекс аналогичного индекса?

Предположим, у меня есть таблица, которая выглядит так:

CREATE TABLE Activity (
    ActivityID int primary key identity(1,1) ,
    ActivityName nvarchar(10),
    InactiveFlag bit
)

с индексом, который выглядит так:

CREATE INDEX Activity_Index on Activity 
( 
    ActivityName
)

, то по какой-то причине кто-то создал второй индекс:

CREATE INDEX Another_Activity_Index on Activity 
( 
    ActivityName, InactiveFlag
)

безопасно ли удалить первый индекс? Это просто занятие лишнего дискового пространства? Будет ли второй индекс охватывать все случаи первого? Сначала упорядочивание столбцов является "ActivityName".

6 голосов | спросил Rocklan 23 Mayam13 2013, 05:33:43

2 ответа


9

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

Если второй столбец во втором индексе был чем-то шире, то я мог бы быть немного менее кавалером относительно моего совета о том, чтобы сбросить первый индекс. Например, если этот столбец был широким varchar, то дополнительный ввод-вывод должен был использовать индекс при необходимости (и когда ---- +: = 1 =: + ---- не были нужны для вывода или фильтрации) на самом деле сделали бы первый индекс (даже если он технически избыточным) более желательным для удовлетворения этого типа запроса.

Итак, просто длинный способ сказать: это зависит. : -)

ответил Aaron Bertrand 23 Mayam13 2013, 05:38:32
3

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

Всякий раз, когда мне нужно пересмотреть определение дублирующего индекса, я обращаюсь к сообщениям Kimberly Tripp:

http://www.sqlskills.com/blogs/kimberly/how-can-you-tell-if-an-index-is-really-a-duplicate/ http://www.sqlskills.com/blogs/kimberly/removing-duplicate- индексы /

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

columns_in_tree: [ActivityID] columns_in_leaf: все столбцы


columns_in_tree: [ActivityName] columns_in_leaf: [ActivityName], [ActivityID]


columns_in_tree: [ActivityName], [InactiveFlag] columns_in_leaf: [ActivityName], [InactiveFlag], [ActivityID]

НТН

ответил SQLRockstar 23 Mayam13 2013, 05:49:41

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132