2012-03-19 17 views
34

Mam indeks UNIQUE, NON CLUSTERED w tabeli, która obecnie korzysta z 4 kolumn dla indeksu.SQL Server: jak napisać instrukcję indeksu zmian, aby dodać kolumnę do unikalnego indeksu?

Chcę utworzyć skrypt alter, który może jedynie dodać kolejną kolumnę do tego indeksu. Nowy typ kolumny to varchar. Ta baza danych to SQL Server 2005.

Z góry dziękuję.

+2

Jestem pewien, że czegoś mi brakuje, ale dlaczego nie możesz po prostu użyć tabeli 'DROP INDEX '. ; UTWÓRZ UNIKALNY INDEKS ZA STÓŁ (Col1, Col2, Col3, Col4) ' –

+0

@Lieven, myślałem o tym też. Czy można bezpiecznie PRZECIĄGAĆ, a następnie STWORZYĆ indeks z istniejącymi danymi w tabeli? –

+1

Tak. Możesz upuszczać i tworzyć indeksy dowolnie. Jedyne, co można zauważyć, to spadek wydajności przy wykonywaniu zapytań, podczas gdy indeksy zniknęły, ale znikają, a tworzenie indeksu (żadnego klastra) nie ma ** wpływu ** na rzeczywiste dane przechowywane w tabelach * (Tworzenie wpływu na indeks klastrowany) fizyczne porządkowanie twoich danych, ale znowu, ** nie ** dane są tracone) * –

Odpowiedz

63

Nie możesz zmieniać indeks - wszystko, co można zrobić, to

  1. spadać stary indeks (DROP INDEX (indexname) ON (tablename))
  2. ponownie utworzyć nowy indeks z dodatkowej kolumnie w nim:

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

Instrukcja ALTER INDEX w SQL Server jest dostępna do zmiany niektórych właściwości (właściwości przechowywania itp.) Istniejącego g indeksu, ale nie pozwala na zmiany kolumn tworzących indeks.

+1

Dzięki Marc, twoje zaproponowane rozwiązanie działa, a skrypt zatwierdzony przez DBA w naszym zespole. –

+35

Teraz masz mnie zakłopotany ... dlaczego zadać pytanie, czy masz DBA w swoim zespole? –

+3

Sprawdź w DROP_EXISTING na stronie tworzenia indeksu w witrynie MSDN. Z pewnymi ograniczeniami możesz modyfikować indeks. Zobacz odpowiedź Paula White'a tutaj. http://www.sqlservercentral.com/Forums/Topic913722-391-1.aspx – Gabe

3

Jeśli nowa kolumna, którą dodajesz do indeksu, znajduje się na końcu listy kolumn - innymi słowy, jeśli lista kolumn starego indeksu jest prefiksem listy kolumn nowego indeksu - to wiersze które są posortowane według starych kolumn będą nadal sortowane według nowych kolumn. W Sybase SQL Server i prawdopodobnie starszych wersjach Microsoft SQL Server dostępna była opcja with sorted_data, pozwalająca zadeklarować, że wiersze zostały już posortowane. Ale na MSSQL 2008 R2 wydaje się, że nie ma żadnego efektu; opcja jest akceptowana, ale cicho ignorowana. W każdym razie myślę, że opcja była najbardziej przydatna w przypadku indeksów klastrowych.

Inni wymienili with drop_existing, co brzmi świetnie, ale dotyczy tylko droższych wersji MSSQL.

+1

Skąd czerpiesz 'z sorted_data'? Nie widzę "sorted_data" wymienionych jako 'with', vel" relational_index_option ", z' create index' Statement w dokumentacji SQL Server 2008+ dla tego Statement (at: [link] (https: // docs. microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql)). – Tom

+1

'with sorted_data' to coś, co pamiętam ze starych czasów Sybase SQL Server. Firma Microsoft usunęła niektóre opcje tworzenia indeksów funky obsługiwane przez Sybase, ale nie tego. Szybki eksperyment na MSSQL 2008 R2 pokazuje jednak, że może to być operacja "no-op"; nie podano błędu, jeśli dane w tabeli nie zostały posortowane. Więc zmienię moją odpowiedź. –

+0

Szybkie wyszukiwanie pokazuje, że opcja została udokumentowana dla MSSQL 2000. –