J'ai lu à ce sujet sur les forums MSDN et ici et je ne suis toujours pas clair. Je pense que c'est correct: Varchar (max) sera stocké en tant que type de données texte, ce qui présente des inconvénients. Disons donc que votre champ sera sûrement inférieur à 8000 caractères. Comme un champ BusinessName dans ma table de base de données. En réalité, un nom d'entreprise sera probablement toujours sous (tirant un numéro de mon chapeau) 500 caractères. Il semble que beaucoup de champs varchar que je rencontre tombent bien sous le nombre de caractères 8k.
Dois-je donc faire de ce champ un varchar (500) au lieu de varchar (8000)? D'après ce que je comprends de SQL, il n'y a aucune différence entre les deux. Donc, pour vous faciliter la vie, je voudrais définir tous mes champs varchar comme varchar (8000). Cela a-t-il des inconvénients?
Connexes: Taille des colonnes varchar (je n'avais pas l'impression que celle-ci répondait à ma question).
la source
Réponses:
Du point de vue du traitement, cela ne fera aucune différence d'utiliser varchar (8000) vs varchar (500). C'est plus une sorte de "bonne pratique" de définir une longueur maximale qu'un champ doit contenir et de rendre votre varchar cette longueur. C'est quelque chose qui peut être utilisé pour aider à la validation des données. Par exemple, une abréviation d'état doit être de 2 caractères ou un code postal / zip de 5 ou 9 caractères. C'était une distinction plus importante lorsque vos données interagissaient avec d'autres systèmes ou interfaces utilisateur où la longueur du champ était critique (par exemple un jeu de données de fichier plat mainframe), mais de nos jours, je pense que c'est plus une habitude qu'autre chose.
la source
Un exemple où cela peut faire une différence est que cela peut empêcher une optimisation des performances qui évite d'ajouter des informations de version de ligne aux tables avec des déclencheurs after.
Ceci est couvert par SQL Kiwi ici
De même, si vous utilisez des tables à mémoire optimisée depuis 2016, il est possible d'utiliser des colonnes LOB ou des combinaisons de largeurs de colonne qui pourraient potentiellement dépasser la limite d'entrée, mais avec une pénalité.
Cela peut avoir un effet négatif important sur la consommation de mémoire et les performances
Un autre cas où la surdéclaration des largeurs de colonne peut faire une grande différence est si la table sera un jour traitée à l'aide de SSIS. La mémoire allouée pour les colonnes de longueur variable (non BLOB) est fixe pour chaque ligne dans un arbre d'exécution et correspond à la longueur maximale déclarée des colonnes, ce qui peut conduire à une utilisation inefficace des tampons mémoire (exemple) . Bien que le développeur du package SSIS puisse déclarer une taille de colonne plus petite que la source, cette analyse est mieux effectuée à l'avance et appliquée à cet endroit.
De retour dans le moteur SQL Server lui-même, un cas similaire est celui lors du calcul de l'allocation de mémoire à allouer pour les
SORT
opérations, SQL Server suppose que lesvarchar(x)
colonnes consommeront en moyenne desx/2
octets.Si la plupart de vos
varchar
colonnes sont plus pleines que cela, cela peut entraîner dessort
débordements d'opérationstempdb
.Dans votre cas, si vos
varchar
colonnes sont déclarées sous forme d'8000
octets mais ont en fait un contenu beaucoup moins important que cela, votre requête se verra allouer de la mémoire dont elle n'a pas besoin, ce qui est évidemment inefficace et peut conduire à des attentes d'attribution de mémoire.Ceci est couvert dans la partie 2 du Webcast 1 des ateliers SQL téléchargeable à partir d'ici ou voir ci-dessous.
la source
char(4)
car il y a de toute façon 2 octets de surcharge par colonne variable.En dehors des meilleures pratiques (réponse de BBlake)
la source
nvarchar
etvarchar
types, cela signifie uniquement que les espaces de fin sont préservés lors de l'insertion - pas que les valeurs sont remplies d'espaces à la taille de la colonne, comme danschar
etnchar
.Les grandes colonnes présentent certains inconvénients qui sont un peu moins évidents et qui pourraient vous surprendre un peu plus tard:
En règle générale, essayez d'être prudent avec la largeur de la colonne. Si cela devient un problème, vous pouvez facilement l'élargir pour répondre aux besoins. Si vous remarquez des problèmes de mémoire plus tard, réduire une colonne large plus tard peut devenir impossible sans perdre de données et vous ne saurez pas par où commencer.
Dans votre exemple de noms d'entreprise, réfléchissez à l'endroit où vous pouvez les afficher. Y a-t-il vraiment de la place pour 500 caractères ?? Sinon, il est inutile de les stocker en tant que tels. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States répertorie certains noms de sociétés et le maximum est d'environ 50 caractères. J'utiliserais donc 100 pour la colonne max. Peut-être plus comme 80.
la source
Idéalement, vous voudriez être plus petit que cela, jusqu'à une longueur de taille raisonnable (500 n'est pas de taille raisonnable) et vous assurer que la validation du client détecte lorsque les données vont être trop volumineuses et envoyer une erreur utile.
Alors que le varchar ne va pas réellement réserver d'espace dans la base de données pour l'espace inutilisé, je me souviens que les versions de SQL Server avaient un snit sur les lignes de base de données étant plus larges qu'un certain nombre d'octets (ne me souviens pas du nombre exact) et jetant en fait toutes les données ne correspondaient pas. Un certain nombre de ces octets étaient réservés à des éléments internes à SQL Server.
la source