Puisque de varchar
toute façon allouer de l'espace de manière dynamique, ma question est de savoir si l'utilisation varchar(255)
est plus efficace ou économise plus d'espace que l'utilisation varchar(5000)
. Si oui, pourquoi?
sql-server
Tintin
la source
la source
Réponses:
Oui, cela
varchar(5000)
peut être pire quevarchar(255)
si toutes les valeurs rentrent dans ce dernier. La raison en est que SQL Server estimera la taille des données et, à son tour, les allocations de mémoire en fonction de la taille déclarée (non réelle ) des colonnes d'une table. Lorsque vous l'avezvarchar(5000)
, il supposera que chaque valeur comporte 2 500 caractères et réservera de la mémoire en fonction de cela.Voici une démo de ma récente présentation GroupBy sur les mauvaises habitudes qui facilite la preuve par vous-même (nécessite SQL Server 2016 pour certaines des
sys.dm_exec_query_stats
colonnes de sortie, mais devrait toujours être prouvable avecSET STATISTICS TIME ON
ou d'autres outils sur les versions antérieures); il montre une plus grande mémoire et des durées d'exécution plus longues pour la même requête par rapport aux mêmes données - la seule différence est la taille déclarée des colonnes:Alors, oui, dimensionnez correctement vos colonnes , s'il vous plaît.
De plus, j'ai relancé les tests avec varchar (32), varchar (255), varchar (5000), varchar (8000) et varchar (max). Des résultats similaires ( cliquez pour agrandir ), bien que les différences entre 32 et 255, et entre 5 000 et 8 000, étaient négligeables:
Voici un autre test avec le
TOP (5000)
changement pour le test plus entièrement reproductible qui me harcelait sans cesse ( cliquez pour agrandir ):Ainsi, même avec 5000 lignes au lieu de 10000 lignes (et il y a plus de 5000 lignes dans sys.all_columns au moins aussi loin que SQL Server 2008 R2), une progression relativement linéaire est observée - même avec les mêmes données, plus la taille définie est grande de la colonne, plus de mémoire et de temps sont nécessaires pour satisfaire exactement la même requête (même si elle n'a pas de sens
DISTINCT
).la source
varchar(450)
etvarchar(255)
serait-elle la même? (Ou quelque chose en dessous de 4000?)rowcount*(column_size/2)
.