88 votes

L'augmentation de la taille de la colonne VARCHAR dans une grande table peut-elle poser des problèmes ?

J'utilise SQL Server 2008 et j'ai besoin d'agrandir un champ VARCHAR, de (200 à 1200) sur une table d'environ 500 000 lignes. J'ai besoin de savoir s'il existe des problèmes auxquels je n'ai pas pensé.

Je vais utiliser cette instruction TSQL :

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

Je l'ai déjà essayé sur une copie des données et cette déclaration n'a pas eu d'effets néfastes que j'ai pu constater.

Y a-t-il des problèmes que je n'ai pas envisagés ?

D'ailleurs, la colonne n'est pas indexée.

1 votes

@nonnb : c'est une idée terrible. stackoverflow.com/q/2091284/27535

0 votes

@gbn un avis sur la récente réponse de Justin à cette question ? Elle semble être en désaccord avec la vôtre.

0 votes

@AakashM : il a raison au sujet du stockage mais c'est une surcharge, pas une optimisation. Lisez maintenant ceci stackoverflow.com/q/2009694/27535

60voto

gbn Points 197263

Il s'agit uniquement d'un changement de métadonnées : c'est rapide.

Une observation : spécifiez NULL ou NOT NULL explicitement pour éviter les "accidents" si l'un des paramètres SET ANSI_xx est différent, par exemple, exécuté dans osql et non SSMS pour une raison quelconque.

1 votes

Tout s'est bien passé avec ça. Aucun problème.

0 votes

Savez-vous si les mêmes règles s'appliquent lorsque l'on passe de varchar(200) a varchar(max) ?

0 votes

@CodeNaked : il est beaucoup plus difficile de répondre à cette question. (max) est un type de LOB qui peut être "dans la rangée" ou en dehors de la rangée. Cependant, je suis enclin à dire que cela devrait être la même chose car les données sont déjà "dans la ligne" et aucune reconstruction de table ne serait nécessaire.

13voto

jazzcat Points 862

Je voulais juste ajouter mon grain de sel, puisque j'ai cherché cette question sur Google parce que je me suis retrouvé dans une situation similaire...

SOYEZ PRÊTS qu'en passant de varchar(xxx) a varchar(yyy) est un changement de méta-données en effet, mais le fait de changer en varchar(max) ne l'est pas. Parce que varchar(max) (alias valeurs BLOB - image/texte, etc.) sont stockées différemment sur le disque, non pas à l'intérieur d'une ligne de table, mais "hors ligne". Ainsi, le serveur peut devenir fou sur une grande table et ne plus répondre pendant des minutes (heures).

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS. Il en va de même pour nvarchar ou cours.

4voto

Kprice84 Points 53

Le passage de Varchar(200) à Varchar(1200) ne devrait pas poser de problème puisqu'il ne s'agit que d'un changement de métadonnées et comme SQL Server 2008 tronque les espaces vides excessifs, vous ne devriez pas non plus constater de différences de performances. En résumé, le changement ne devrait pas poser de problème.

0 votes

Je pense que cela peut être vrai pour les petites tables, mais pour les grandes tables qui sont activement interrogées, cela pourrait bloquer pendant un temps significatif (car le serveur SQL a besoin de voir s'il doit tronquer chaque ligne).

0voto

psikorski Points 1

Une autre raison pour laquelle vous devriez éviter de convertir la colonne en varchar(max) est que vous ne pouvez pas créer un index sur une colonne varchar(max).

-3voto

user3149904 Points 97

Dans mon cas, la colonne alter ne fonctionnait pas, donc on peut utiliser la commande 'Modify', comme par exemple :

alter table [nom_table] MODIFIER la colonne [nom_colonne] varchar(1200) ;

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