SQL Server alter table pour changer TEXT en NVARCHAR (MAX) augmentant considérablement la taille de la base de données

8

J'ai besoin de mettre à jour une base de données SQL Server d'environ 18 Go pour changer un nombre important de TEXTcolonnes en NVARCHAR(MAX).

Le problème que j'ai est après avoir exécuté toutes les alter tablecommandes, la base de données finit par avoir une taille de près de 26 Go. Je comprends qu'à partir de maintenant, l'utilisation NVARCHAR(MAX)permettra à la DB de croître plus lentement, mais y a-t-il un moyen d'empêcher ce ballonnement?

Aidan Lawless
la source
2
Oh, ne créez pas la même question ici. Il suffit de le signaler sur SO et les mods le migreront ici en un instant :-). Maintenant, quelqu'un doit fusionner / nettoyer..etc.
Marian
2
La base de données est-elle plus grande ou le journal est-il très volumineux?
Aaron Bertrand
Désolé Marian, comprends maintenant ...
Aidan Lawless
Aaron, le fichier MDF est beaucoup plus gros .... presque 10 Go plus grand
Aidan Lawless

Réponses:

7

J'espère que ce message vous sera utile.

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

Faits marquants:

  • Par défaut, TEXT et NTEXT stockent la valeur du texte dans la structure LOB
  • Par défaut, NVARCHAR (MAX) stocke la valeur du texte dans la structure du tableau (sauf si elle dépasse 8000 octets)
  • Lorsque vous modifiez la colonne de TEXT / NTEXT à NVARCHAR (MAX), la façon dont les données sont stockées n'est pas modifiée, elle met uniquement à jour les métadonnées de la table. La structure des données n'est modifiée que la prochaine fois que la valeur est modifiée. Cela peut être fait immédiatement en exécutant quelque chose comme ceci:

      update mytable set mycolumn1 = mycolumn1
  • Si vous utilisez le paramètre d'option de table par défaut pour NVARCHAR (MAX), les données de votre table seront plus volumineuses.

    - Vous devrez examiner les paramètres et l'environnement de votre option de table avant de modifier le paramètre en fonction de vos besoins.

  • La taille de votre table finira par diminuer si vous suivez votre instruction alter table avec l'instruction update table.

En bref, si vous exécutez l'instruction de mise à jour, forçant le stockage de la structure de données à être modifié, la taille de votre base de données sera plus petite, comme prévu.

EDIT : Comme vous avez mentionné TEXT et non NTEXT, votre gain d'espace serait moins évident que vous ne le pensez. NTEXT occupe le double de l'espace comme le fait TEXT, mais en même temps, vous devez vous attendre à ce que NVARCHAR (MAX) occupe environ la moitié de l'espace comme le fait NTEXT. Par mon calcul, vous verriez peu de changement par rapport à la taille de votre base de données d'origine.


Crédit spécial à http://www.douglubey.com/

RoKa
la source
2
pourriez-vous résumer ici les faits importants, au cas où le lien pourrait devenir mort.
Stephane Rolland
Comme mentionné dans d'autres réponses, TEXT vs NTEXT aura un impact sur le stockage, mais pas autant que vous l'avez suggéré.
RoKa
Merci ... Je repousse l'adhésion depuis des années maintenant ... Content d'être ici.
RoKa
Merci RoKA, cela a fait une différence significative pour quelques tables en question. Je vais à nouveau restaurer la base de données et le faire progressivement pour voir les effets. Merci encore .....
Aidan Lawless
Avec plaisir.
RoKa
6

Cela peut être une erreur dans votre question, mais vous dites TEXT to NVARCHAR (max) et non NTEXT to NVARCHAR (max). Si c'est ce que vous faites vraiment, vous passez d'ANSI à UNICODE et vous ne devriez pas être surpris que cela prenne plus de place (caractères à un octet contre caractères à plusieurs octets).

spaghettidba
la source
Oui, c'est ce que je fais ... bien que basé sur quelques calculs simples, il ne tiendrait pas compte de l'ampleur de l'augmentation.
Aidan Lawless
2
Avez-vous essayé avec la suggestion de RoKa?
spaghettidba
1
@AidanLawless quels sont ces calculs? La taille de la base de données devrait au moins augmenter de la taille du TEXTchamp existant - passer à unicode prend exactement le double de l'espace de stockage d'ANSI.
JNK
2
@JNK ... à moins d'utiliser la compression en 2008 R2 ou mieux, où la compression Unicode traitera les caractères ASCII stockés dans NVARCHAR comme VARCHAR.
Aaron Bertrand