Il y a un très bon article sur ce sujet, de SORTE que l'Utilisateur @Remus Rusanu. Voici une snippit que j'ai volé, mais je vous suggère de lire l'ensemble de la chose:
Le chemin de code qui gère le MAX de types (varchar, nvarchar et
varbinary) est différent du chemin de code qui gère leur
non équivalentes max types de longueur. Le non-max types peuvent être à l'interne
représenté comme un pointeur ordinaire-et-la longueur de la structure. Mais le max
les types ne peuvent pas être stockées en interne une zone mémoire contiguë, depuis
ils peuvent peut-être se développer jusqu'à 2 go. Ils doivent donc être représenté par un
interface de diffusion, semblables à COM IStream. Cela porte à plus de
chaque opération qui consiste à le max de types de, y compris le simple
affectation et comparaison, étant donné que ces opérations sont plus complexes
au cours d'une interface de diffusion. Le plus grand impact est visible dans le code
qui alloue et attribuer max-variables de type (mon premier essai), mais le
l'impact est visible sur chaque opération.
Dans l'article il montre plusieurs exemples qui démontrent que l'utilisation de varchar(n) permet généralement d'améliorer les performances.
Vous pouvez trouver l'intégralité de l'article ici.