performances nchar vs nvarchar

Comment avez-vous décidé d'utiliser nvarchar ou nchar ?

Par exemple, j'ai remarqué que la database d'appartenance par défaut créée par le fournisseur sqlmembership déclare que la colonne Email doit être de type nvarchar (256)

Pour moi, cela semble être une valeur maximale inutilement grande pour une colonne d'email. Je suppose que dans des circonstances normales, les courriels de plus de 40 ou 50 caractères seraient plutôt rares.

Mais comme datatables telles que les adresses e-mail varient en longueur devraient-ils toujours être stockés en tant que nvarchar afin d'éliminer l'espace redondant?

Si vous utilisez nvarchar pour une colonne e-mail. Dans le cas d'une modification de l'adresse e-mail, si le nouvel e-mail est plus long que l'e-mail précédent, cela entraînera de nombreuses fractionnements de page et, par conséquent, une grande partie du coût de la performance?

Souhaitez-vous envisager d'utiliser nchar (40) pour une adresse e-mail et de compromettre la perte d'espace de stockage en échange de coûts de performance de séparation de page non?

Ou est-ce que l'utilisation de nchar (40) augmenterait significativement la taille de la database, causant ainsi d'autres pertes de performance sur la vitesse de la requête?

Est-ce que «utiliser nchar seulement quand vous connaissez la taille des données pour remplir la colonne» est une règle raisonnable à suivre?

les emails de plus de 40 ou 50 caractères seraient plutôt rares

Il n'en faut qu'un pour ruiner votre model …

Si le nouveau courriel est plus long que le courriel précédent, cela entraînera de nombreuses divisions de page

Non. Mais même si c'était le cas, ce n'est pas comme ça que vous concevez votre model de données. Disons, pour le bien de l'argument, que chaque fois qu'un email est mis à jour, cela provoquerait un split de page. Voulez-vous optimiser pour cela ? Non, car pré-allouer une grande taille fixe (c'est-à-dire en utilisant un NCHAR (256)) est bien pire, il élimine en effet le split de page potentiel à la mise à jour (encore une fois coût de l'augmentation de la taille de la table, ce qui se traduit par la bande passante IO et la consommation de memory, voir l' espace disque est bon marché … CE N'EST PAS LE POINT !!! .

Pourquoi est-ce que je dis que les mises à jour de longueur variable ne causent pas de fractionnement de page? Parce que les divisions de page sont forcées lorsque l'image de ligne ne correspond plus à la page. Une mise à jour d'une colonne de longueur variable provoquera probablement un dépassement de ligne et laissera la ligne à la même taille qu'avant, ou même plus petite. Il y a des cas où la taille de la ligne augmentera après le débordement, mais il y a plusieurs conditions pour que cela triggers effectivement un split de page:

  • la mise à jour de valeur doit triggersr une augmentation de taille de ligne, cela ne peut se produire que lors de la mise à jour d'une valeur inférieure au pointeur de 24 octets décrit dans Table and Index Organization vers une valeur supérieure à cette taille de pointeur.
  • l'augmentation de la taille des lignes (qui par définition est au plus de 24 octets d'augmentation pour chaque colonne variable mise à jour, y compris les mises à jour de NULL à non NULL) doit aboutir à une ligne qui ne rentre pas dans la page.
  • il ne devrait pas y avoir de récupération d'espace possible en ligne en poussant les autres champs hors ligne (c'est-à-dire que tous les champs de longueur variable sont déjà poussés hors ligne)

Je n'achète vraiment pas que vous avez une charge de travail aussi étrange et ésotérique que les conditions ci-dessus pour être le facteur principal dans la conduite de votre design. Utilisez un NVARCHAR de longueur pratique pour s'adapter à toute valeur que vous rencontrerez.