|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Bonsoir à tous,
J'ai lu quelque part, sur les blogs de développez il me semble qu'il était contre-performant de réaliser un ALTER sur une table (en particulier volumineuse) plutôt que de créer une nouvelle table en y copiant les données. Dans mes souvenirs, le cas d'un ALTER qui modifiait le type d'une colonne pour la rendre plus large faisait perdre l'ancien espace dans chaque page de données.. Malheureusement je ne retrouve plus le billet qui en parlait... Si votre mémoire est meilleur que la mienne, je suis à la recherche du lien De plus, est-ce qu'il est possible de retrouver dans une base toutes les tables qui ont pu subir ce genre de modification ? Merci pour vos souvenirs.
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 724 ![]() |
Citation:
Citation:
++ |
||
|
00
|
|
|
#3 | |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Citation:
Dans un des cas, je passe d'un INT à du DECIMAL(19,4) :p Mais l'idée est aussi de retrouver toutes les tables volumineuses qui ont pu "souffrir" de ces alter.
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
|
00
|
|
|
#4 | ||||
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Je reviens un peu sur ma question...
Je suis en train de chercher la liste des tables qui ont pu subir une opération d'ALTER. Pour cela j'utilise la requête suivante qui me retourne les tables pour lesquelles la somme des taille des colonnes est différente du MAX de l'ofset de départ + la taille de cette même colonne : Code :
![]() Je précise que les colonnes en question sont des VARCHAR, non MAX Code :
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
||||
|
|
00
|
|
|
#5 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
En fait, les -1 sont bien pour le cas des types VARCHAR. De plus, les bit ont également un traitement particulier
Ça devient compliqué pour détecter les tables "fautives"
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#6 | ||||||||
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 724 ![]() |
Tu ne pourras pas utiliser la vue système sys.system_internals_partition_columns. La colonne leaf_offset n'est réellement utilisable que pour les types de données fixes car la longueur est prédictible dans ce cas. Avec les types de données variables la longueur est directement dépendante de la donnée donc déterminer à l'avance le leaf_offset n'est pas possible. En revanche les numéros s'incrémentent pour déterminer le nombre de colonnes variables dans ce cas. Par exemple :
Code :
Code :
Code :
Code :
++ |
||||||||
|
00
|
|
|
#7 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Merci pour la précision. Du coup pour ces longueur varchar, l'emplacement de démarrage de chacun des champs dépend complètement de la longueur de la valeur ? Il n'y a plus rien de fixe.
Détecter toutes les tables à "problème" devient donc plus compliqué et il vaut mieux alors faire une reconstruction complète de toutes celles-ci. En terme de performance, pour des tables volumineuses de plusieurs centaines de millions de lignes, pour effectuer une modification de type vaut-il mieux alors faire comme le propose SSMS en reconstruisant une nouvelle table ou plutôt conserver cette commande ALTER et le faire suivre d'un ALTER ? Sur une base de production, l'avantage de la nouvelle table est de ne pas bloquer l'accès à l'ancienne, alors que le ALTER pose un verrou ?
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 724 ![]() |
Citation:
Une commande ALTER qui supprime une colonne, ajoute une colonne avec NULL par défaut ou augmente la longueur d'une colonne ne touchera pas aux données et il n'y aura pas besoin de faire une analyse ligne à ligne des données. Une commande ALTER qui annule l'acceptation des absences de valeurs (NULL) ou diminue la longueur d'une colonne devra examiner et valider l'ensemble des valeurs des colonnes concernées sans pour autant y toucher. Sur une table volumineuse le processus peut prendre du temps. Enfin d'autres changements impliquent un changement physique au niveau des lignes de données comme l'ajout d'une colonne avec par défaut une valeur non NULL. Dans ce cas, chaque changement de ligne doit être loggé dans le journal des transactions. Bien entendu le processus peut être très long ici et consommateur de ressources. Citation:
++ |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com