Dois-je toujours utiliser (n)varchar(max)
pour les colonnes de texte?
Non.
Pour SQL Server, les max
types de données ne doivent être spécifiés qu'en l'absence d'alternative. Il convient plutôt de choisir le type de base correct ( varchar
ou nvarchar
) et de spécifier une longueur maximale explicite appropriée aux données à stocker.
Le stockage physique est identique, que la colonne soit tapée comme varchar(n)
ou varchar(max)
, ce n'est donc pas le problème.
Les raisons de ne pas choisir (n)varchar(max)
partout tournent autour des fonctionnalités, de la qualité du plan et des performances.
Une liste exhaustive n'est probablement pas pratique, mais entre autres, des max
colonnes:
traits
- Exiger une contrainte distincte pour appliquer une longueur maximale
- Ne peut pas être une clé dans un index (donc pas de contraintes uniques non plus)
- Peut empêcher DDL en ligne (y compris les reconstructions d'index et l'ajout d'une nouvelle colonne non nulle)
- Ne sont généralement pas pris en charge pour les fonctionnalités «plus récentes», par exemple columnstore
- Consultez la documentation du produit pour connaître les fonctionnalités et limitations plus spécifiques. Le schéma général est qu'il existe des limitations et des restrictions gênantes autour
max
des types de données. Toutes les limitations et effets secondaires ne sont pas documentés.
Performance
- Exiger une manipulation spéciale dans le moteur d'exécution, pour tenir compte de la taille potentiellement très grande. En règle générale, cela implique d'utiliser un chemin de code moins efficace, avec une interface de streaming
- Peut avoir des conséquences imprévues similaires pour le code externe (et d'autres composants SQL Server comme SSIS), qui doivent également être préparés pour gérer des données jusqu'à 2 Go
- Sont supposés avoir une largeur de 4 000 octets dans les calculs d'allocation de mémoire. Cela risque d'entraîner une réservation de mémoire excessive, ce qui limite la simultanéité et pousse les pages d'index et de données précieuses hors de la mémoire cache
- Désactivez plusieurs optimisations de performances importantes
- Peut prolonger la durée du verrouillage
- Peut empêcher l'optimiseur de choisir un plan de recherche (non dynamique)
- Empêche les filtres d'être poussés dans les analyses et recherche comme résidu
- Peut augmenter la pression et la contention de tempdb (selon la version), car les variables et les paramètres sont également susceptibles d'être tapés de manière
max
à correspondre aux définitions de colonne
En résumé, il y a tellement d'effets secondaires subtils (et indésirables) à utiliser inutilement le max
spécificateur que cela n'a aucun sens de le faire. La «commodité» mineure de l'utilisation d'une seule déclaration n'est pas une sorte de compensation.
Évaluez chaque type dans son contexte, utilisez le type de base correct ( varchar
ou nvarchar
) et une longueur explicite sensible.
Lectures complémentaires:
Paul White dit GoFundMonica
la source
varchar(not-max)
paramètres, donc j'ai un peu mis un pied dans la bouche ici. Mais oui, l'injection SQL serait applicable ici. Je devrais peut-être reformuler un peu cette réponse.