66 votes

SQL Server : comment écrire une instruction alter index pour ajouter une colonne à l'index unique ?

J'ai un UNIQUE, NON CLUSTERED sur une table qui utilise actuellement 4 colonnes pour l'index.

Je veux créer un script alter script qui peut simplement ajouter une autre colonne à cet index. Le nouveau type de colonne est varchar .

La base de données est SQL Server 2005.

Merci d'avance.

2 votes

Je suis sûr que j'ai raté quelque chose, mais pourquoi ne pas utiliser simplement DROP INDEX Table.<Index>; CREATE UNIQUE INDEX <Index> ON Table (Col1, Col2, Col3, Col4)

0 votes

@Lieven, j'y ai pensé aussi. Est-il possible de DROP en toute sécurité et de CREER ensuite l'index avec les données existantes dans la table ?

1 votes

Oui, vous pouvez supprimer et créer des index à volonté. Tout ce que vous remarquerez peut-être, c'est une baisse des performances lors de l'exécution des requêtes pendant que les index ont disparu, mais l'abandon et la création d'un index (non groupé) n'ont pas d'incidence sur les performances des requêtes. no l'impact sur les données réelles stockées dans vos tables. (La création d'un index en grappe a un impact sur l'ordre physique de vos données, mais encore une fois, no les données sont perdues)

106voto

marc_s Points 321990

Vous ne pouvez pas modifier un index - tout ce que vous pouvez faire, c'est

  1. supprimer l'ancien index ( DROP INDEX (indexname) ON (tablename) )

  2. recréer le nouvel index avec la colonne supplémentaire :

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

En ALTER INDEX dans SQL Server (voir documents ) est disponible pour modifier certaines propriétés (propriétés de stockage, etc.) d'un index existant, mais il ne permet pas de modifier les colonnes qui composent l'index.

1 votes

Merci Marc, la solution proposée a fonctionné, et script a été approuvée par les DBA de notre équipe.

51 votes

Pourquoi poser la question si vous avez des administrateurs de bases de données dans votre équipe ?

5 votes

Consultez DROP_EXISTING dans la page Create Index (Créer un index) sur MSDN. Avec certaines restrictions, vous pouvez modifier un index. Voir la réponse de Paul White ici. sqlservercentral.com/Forums/Topic913722-391-1.aspx

3voto

Ed Avis Points 302

Si la nouvelle colonne que vous ajoutez à l'index se trouve à la fin de la liste des colonnes - en d'autres termes, si la liste des colonnes de l'ancien index est un préfixe de la liste des colonnes du nouvel index - les lignes qui sont triées en fonction des anciennes colonnes seront toujours triées en fonction des nouvelles colonnes. Dans Sybase SQL Server et peut-être dans des versions plus anciennes de Microsoft SQL Server, il existait une fonction with sorted_data qui permet de déclarer que les lignes sont déjà triées. Mais sur MSSQL 2008 R2, cela ne semble avoir aucun effet ; l'option est acceptée mais ignorée silencieusement. Quoi qu'il en soit, je pense que l'option était surtout utile avec les index en grappe.

D'autres ont mentionné with drop_existing qui a l'air génial, mais qui est réservé aux versions plus chères de MSSQL.

1 votes

Où obtenez-vous with sorted_data de ? Je ne vois pas sorted_data répertorié en tant que with alias "relational_index_option", de l'élément create index dans la documentation de SQL Server 2008+ pour cette déclaration (à l'adresse lien ).

2 votes

with sorted_data est quelque chose dont je me souviens du temps de Sybase SQL Server. Microsoft a supprimé certaines des options bizarres de création d'index que Sybase prenait en charge, mais pas celle-ci. Cependant, une expérience rapide sur MSSQL 2008 R2 montre qu'il peut maintenant s'agir d'un non-sens ; aucune erreur n'est donnée si les données de la table ne sont pas triées. Je vais donc revoir ma réponse.

0 votes

Une recherche rapide montre que l'option a été documentée pour MSSQL 2000.

2voto

JGonDev Points 48

J'ai peut-être 9 ans de retard mais voici comment je procède (cela supprime l'index existant et en crée un nouveau avec les colonnes de la liste) :

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]

0voto

Jayanth Balina Points 1

J'espère que modifier l'index signifie qu'il faut d'abord supprimer l'index et le recréer.

syntaxe :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X