Dois-je utiliser varchar(255)
ou varchar(256)
lors de la conception des tables? J'ai entendu qu'un octet est utilisé pour la longueur de la colonne ou pour stocker des métadonnées.
Est-ce plus important à ce stade?
J'ai vu quelques articles sur Internet, mais ils s'appliquent à Oracle et à MySQL.
Nous avons Microsoft SQL Server 2016 Enterprise Edition, comment s'applique-t-il à cet environnement?
Maintenant, disons par exemple, que se passe-t-il si je dis à mes clients de conserver, par exemple, une description textuelle de 255 caractères au lieu de 256, y a-t-il une différence? Ce que j'ai lu "Avec une longueur maximale de 255 caractères, le SGBD peut choisir d'utiliser un seul octet pour indiquer la longueur des données dans le champ. Si la limite était de 256 ou plus, deux octets seraient nécessaires." Est-ce vrai?
Réponses:
Dimensionnez chaque colonne de manière appropriée. N'utilisez PAS une taille "standard" pour chaque colonne. Si vous n'avez besoin que de 30 caractères, pourquoi créer une colonne pouvant en gérer 255? Je suis tellement content que vous ne préconisiez pas l'utilisation
varchar(max)
de vos colonnes de chaînes.C'est un conseil particulièrement prudent si vous avez besoin d'indexer une colonne ou si vous utilisez une colonne comme clé primaire et qu'elle a des références de clé étrangère. SQL Server utilise la taille de chaque colonne dans son optimiseur de requêtes pour comprendre les besoins en mémoire estimés pour le traitement des requêtes. Le fait d'avoir des colonnes surdimensionnées peut nuire aux performances.
Les index des colonnes surdimensionnées peuvent entraîner la génération d'erreurs:
La tentative de création de l'index ci-dessus entraîne cet avertissement:
900 octets est la taille de clé maximale pour les index cluster (et les index non cluster sur SQL Server 2012 et versions antérieures). 1700 octets est la taille de clé maximale pour les index non clusterisés sur les versions plus récentes de SQL Server. Si vous concevez des colonnes avec une largeur générique, telle que (255), vous pouvez rencontrer cet avertissement beaucoup plus souvent que prévu.
Si vous êtes intéressé par les composants internes du stockage, vous pouvez utiliser le petit test suivant pour mieux comprendre comment SQL Server stocke les données de stockage en ligne non compressées.
Tout d'abord, nous allons créer un tableau où nous pouvons stocker des colonnes de différentes tailles:
Nous allons maintenant insérer une seule ligne:
Cette requête utilise les fonctions non documentées et non prises en charge
sys.fn_RowDumpCracker
etsys.fn_PhyslocCracker
pour afficher des détails intéressants sur la table:La sortie ressemblera à ceci:
Comme vous pouvez le voir, le
InRowLength
pour chaque valeur est affiché, ainsi que l'emplacement de stockage physique de chaque ligne - le "file_id", "page_id" et "slot_id".Si nous prenons les valeurs
file_id
etpage_id
des résultats de requête ci-dessus et les exécutonsDBCC PAGE
, nous pouvons voir le contenu réel de la page physique:Les résultats de ma machine sont:
la source
D'autres ont déjà souligné que le nombre d'octets requis pour stocker la longueur est fixe. Je voulais me concentrer sur cette partie de votre question:
Votre question est étiquetée avec l'édition entreprise, ce qui signifie généralement que vous aurez une bonne quantité de données. Souvent, les différences d'un octet par ligne n'ont pas vraiment d'importance en pratique. Par exemple, le tableau suivant avec une
VARCHAR(255)
colonne entièrement remplie occupe 143176 Ko d'espace sur le disque:Résultats:
Créons un deuxième tableau avec une
VARCHAR(256)
colonne entièrement remplie . Cela va prendre au moins un octet de plus par ligne, non?Résultats:
Il se trouve que les deux tables occupent la même quantité d'espace. Le même nombre de lignes tient sur chaque page de 8 Ko. C'est formidable que vous souhaitiez passer du temps à optimiser votre application, mais je pense que vous feriez mieux de vous concentrer sur différents domaines.
la source
La taille déclarée du varchar n'a aucun impact sur les performances. Les données peuvent être réellement stockées en tant que magasin de lignes avec compression de page ou compression de ligne. En tant que magasin de colonnes en cluster ou en tant que table optimisée en mémoire. Chacun d'eux aura des compromis de performances différents, mais il importe peu que vous déclariez un varchar (255) ou varchar (256).
la source