SQL Server: как написать оператор изменения индекса для добавления столбца в уникальный индекс?

У меня есть индекс UNIQUE, NON CLUSTERED для таблицы, которая в настоящее время использует 4 столбца для индекса.

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

База данных - SQL Server 2005.

Заранее спасибо.


person JL.    schedule 19.03.2012    source источник
comment
Я уверен, что мне чего-то не хватает, но почему бы тебе просто не использовать DROP INDEX Table.<Index>; CREATE UNIQUE INDEX <Index> ON Table (Col1, Col2, Col3, Col4)   -  person Lieven Keersmaekers    schedule 19.03.2012
comment
@ Ливен, я тоже об этом думал. Можно ли безопасно УДАЛИТЬ, а затем СОЗДАТЬ индекс с существующими данными в таблице?   -  person JL.    schedule 19.03.2012
comment
да. Вы можете удалять и создавать индексы по своему желанию. Все, что вы могли заметить, - это снижение производительности при выполнении запросов, когда индексы отсутствуют, но удаление и создание (некластеризованного) индекса не оказывает никакого влияния на фактические данные, хранящиеся в ваших таблицах ( Создание кластерного индекса влияет на физический порядок ваших данных, но, опять же, данные не теряются)   -  person Lieven Keersmaekers    schedule 19.03.2012


Ответы (4)


Вы не можете изменить индекс - все, что вы можете сделать, это

  1. удалить старый индекс (DROP INDEX (indexname) ON (tablename))

  2. воссоздайте новый индекс с дополнительным столбцом в нем:

       CREATE UNIQUE NONCLUSTERED INDEX (indexname)
       ON dbo.YourTableName(columns to include)
    

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

person marc_s    schedule 19.03.2012
comment
Спасибо, Марк, предложенное вами решение сработало, а сценарий одобрен администратором баз данных в нашей команде. - person JL.; 19.03.2012
comment
Теперь вы меня озадачили ... зачем задавать этот вопрос, если в вашей команде есть администраторы баз данных? - person Lieven Keersmaekers; 19.03.2012
comment
Посмотрите DROP_EXISTING на странице создания индекса в MSDN. С некоторыми ограничениями вы можете изменять index. См. Ответ Пола Уайта здесь. sqlservercentral.com/Forums/Topic913722-391-1.aspx - person Gabe; 21.04.2014
comment
@LievenKeersmaekers why ask the question if you have DBA's on your team? Может быть, для людей, задающих такой же вопрос? Общая цель StackOverflow? - person Ozkan; 17.06.2021
comment
@LievenKeersmaekers - Индексы Code First ~ должны поддерживаться в Migrations. Миграции, написанные на языке, отличном от sql. Программисты пишут миграции, а не администраторы баз данных - person Brandt Solovij; 17.06.2021

Если новый столбец, который вы добавляете в индекс, находится в конце списка столбцов - другими словами, если список столбцов старого индекса является префиксом списка столбцов нового индекса - тогда строки, которые сортируются по старые столбцы по-прежнему будут отсортированы по новым столбцам. В Sybase SQL Server и, возможно, более старых версиях Microsoft SQL Server была опция with sorted_data, позволяющая объявить, что строки уже отсортированы. Но на MSSQL 2008 R2 это, похоже, не действует; опция принимается, но игнорируется. В любом случае, я думаю, что эта опция была наиболее полезна с кластерными индексами.

Другие упомянули with drop_existing, что звучит великолепно, но только для более дорогих версий MSSQL.

person Ed Avis    schedule 16.10.2015
comment
Откуда ты with sorted_data? Я не вижу sorted_data в списке with, он же relational_index_option, в заявлении create index в документах SQL Server 2008+ для этого утверждения (по адресу: ссылка). - person Tom; 29.03.2017
comment
with sorted_data - это то, что я помню из старых дней Sybase SQL Server. Microsoft удалила некоторые забавные параметры создания индексов, которые поддерживала Sybase, но не эту. Однако быстрый эксперимент с MSSQL 2008 R2 показывает, что теперь он может быть отключен; ошибка не выдается, если данные в таблице не отсортированы. Так что я исправлю свой ответ. - person Ed Avis; 30.03.2017
comment
Быстрый поиск показывает, что эта опция задокументирована для MSSQL 2000. - person Ed Avis; 30.03.2017

Возможно, я опоздал на 9 лет, но я делаю это следующим образом (при этом удаляется существующий индекс и создается новый со столбцами в списке):

CREATE UNIQUE NONCLUSTERED INDEX [INDEX_NAME] ON [TABLE_NAME]
(
    [COLUMN1] DESC,
    [COLUMN2] ASC
) 
WITH
(
    PAD_INDEX = OFF,
    STATISTICS_NORECOMPUTE = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = ON,
    DROP_EXISTING = ON,
    ONLINE = OFF,
    ALLOW_ROW_LOCKS = ON,
    ALLOW_PAGE_LOCKS = ON
) 
ON [PRIMARY]
person jgondev    schedule 05.07.2021

Я надеюсь, что изменение индекса означает, что сначала нам нужно удалить индекс и снова создать индекс.

синтаксис:

if exists
(
select * from sys.indexes where name ='ix_name'
)
BEGIN
DROP INDEX Table.index name
END

IF NOT EXISTS
(
select * from sys.indexes where name ='ix_name'
)
BEGIN
CREATE NONCLUSTERED INDEX 
ON TABLENAME
(
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
--Whatever column u want to add
)
end
go
person Jayanth Balina    schedule 06.03.2021