2012-03-19 20 views
34

Ho un indice UNIQUE, NON CLUSTERED su una tabella che utilizza attualmente 4 colonne per l'indice.SQL Server: come scrivere una dichiarazione di alter indice per aggiungere una colonna all'indice univoco?

Voglio creare un alter script che può semplicemente aggiungere un'altra colonna a questo indice. Il nuovo tipo di colonna è varchar.

La banca dati è il 2005.

Grazie in anticipo SQL Server.

+2

Sono sicuro che mi manca qualcosa, ma perché non puoi semplicemente usare 'Tabella DROP INDEX. ; CREATE UNICO INDICE ON Table (Col1, Col2, Col3, Col4) ' –

+0

@Lieven, stavo pensando anche a questo. È possibile DROP in modo sicuro e quindi CREARE l'indice con i dati esistenti nella tabella? –

+1

Sì. È possibile eliminare e creare indici a volontà. Tutto ciò che si potrebbe notare è una diminuzione delle prestazioni nell'esecuzione di query mentre gli indici sono andati, ma l'eliminazione e la creazione di un indice (senza cluster) ha ** nessun ** impatto sui dati effettivi memorizzati nelle tabelle * (Creazione di impatti di un indice cluster l'ordine fisico dei tuoi dati ma, ancora una volta, ** no ** dati persi) * –

risposta

63

Non è possibile modificare un indice - tutto quello che puoi fare è

  1. cadere il vecchio indice (DROP INDEX (indexname) ON (tablename))
  2. ri-creare il nuovo indice con colonna aggiuntiva in esso:

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

L'istruzione ALTER INDEX in SQL Server è disponibile per modificare alcune proprietà (proprietà di archiviazione, ecc.) Di una indice g, ma non consente modifiche alle colonne che compongono l'indice.

+1

Grazie Marc, la tua soluzione proposta ha funzionato e la sceneggiatura è stata approvata da DBA nel nostro team. –

+35

Ora mi hai lasciato perplesso ... perché porre la domanda se hai DBA nella tua squadra? –

+3

Cerca in DROP_EXISTING nella pagina Crea indice su MSDN. Con alcune restrizioni, puoi modificare un indice. Vedi la risposta di Paul White qui. http://www.sqlservercentral.com/Forums/Topic913722-391-1.aspx – Gabe

3

Se la nuova colonna che si aggiunge all'indice si trova alla fine dell'elenco di colonne, in altre parole, se l'elenco di colonne dell'indice precedente è un prefisso dell'elenco di colonne del nuovo indice, quindi righe che sono ordinati per le vecchie colonne saranno ancora ordinati per le nuove colonne. In Sybase SQL Server e forse nelle versioni precedenti di Microsoft SQL Server, esisteva un'opzione with sorted_data che consente di dichiarare che le righe erano già ordinate. Ma su MSSQL 2008 R2 sembra non avere alcun effetto; l'opzione è accettata ma ignorata silenziosamente. In ogni caso penso che l'opzione fosse per lo più utile con gli indici cluster.

Altri menzionati with drop_existing, che suona bene, ma è solo per le versioni più costose di MSSQL.

+1

Dove stai ottenendo 'with sorted_data' da? Non vedo 'sorted_data' elencato come' with', aka "relational_index_option", dell'istruzione 'create index' nei documenti di SQL Server 2008+ per quella dichiarazione (a: [link] (https: // docs. microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql)). – Tom

+1

'with sorted_data' è qualcosa che ricordo dai vecchi tempi di Sybase SQL Server. Microsoft ha rimosso alcune delle opzioni di creazione dell'indice funky supportate da Sybase, ma non da questo. Tuttavia, un rapido esperimento su MSSQL 2008 R2 mostra che ora potrebbe essere un no-op; non viene dato alcun errore se i dati nella tabella non sono ordinati. Quindi rivedrò la mia risposta. –

+0

Una ricerca rapida mostra che l'opzione è stata documentata per MSSQL 2000. –

Problemi correlati