248 votes

Quelles sont les principales différences de performance entre les types de données SQL Server varchar et nvarchar ?

Je travaille sur une base de données pour une petite application web à mon école en utilisant SQL Server 2005 .
Je vois deux écoles de pensée sur la question des varchar vs nvarchar :

  1. Utilisation varchar à moins que vous ne traitiez un grand nombre de données internationalisées, utilisez alors nvarchar .
  2. Il suffit d'utiliser nvarchar pour tout.

Je commence à voir les mérites du point de vue 2. Je sais que nvarchar prend deux fois plus d'espace, mais ce n'est pas nécessairement un problème énorme puisque cela ne va stocker des données que pour quelques centaines d'étudiants. Il me semble qu'il serait plus simple de ne pas s'en préoccuper et de permettre à tout le monde d'utiliser nvarchar. Ou y a-t-il quelque chose qui m'échappe ?

0 votes

Question similaire ici : stackoverflow.com/questions/312170/ EDIT par le dorfier : qui, de manière intéressante, est arrivé à la conclusion exactement opposée.

6 votes

Le site Internet de la Commission européenne fait référence à un fil de discussion beaucoup plus étoffé qui aboutit à la conclusion opposée. stackoverflow.com/questions/312170/

3 votes

Jason : J'espère qu'il ne s'agit pas d'une demande inappropriée, mais pourriez-vous envisager de modifier la réponse acceptée en de gbn . La réponse de JoeBarone est terriblement erronée pour de nombreuses raisons. Le fait qu'elle soit "acceptée" induit les novices en erreur et les incite à faire de mauvais choix. Il n'est pas nécessaire et c'est du gaspillage de "toujours utiliser NVARCHAR "et cela peut avoir des conséquences très négatives sur les performances et les coûts/budgets du matériel. Quelques lignes, voire quelques milliers, n'ont pas d'importance. Mais les systèmes se développent plus rapidement qu'on ne le pense, de sorte que la réponse actuellement acceptée ne rend pas service à la communauté. Je vous remercie de votre attention.

237voto

gbn Points 197263

L'espace disque n'est pas le problème, mais la mémoire et les performances le sont. Doublement des pages lues, doublement de la taille de l'index, étrange LIKE et = comportement constant, etc.

Avez-vous besoin de stocker du chinois, etc. script ? Oui ou non...

Et de MS BOL " Effets de l'Unicode sur le stockage et les performances "

Editer :

Question récente de l'OS soulignant à quel point les performances des nvarchar peuvent être mauvaises...

SQL Server utilise beaucoup de CPU lors de recherches dans des chaînes nvarchar

20 votes

+1, si votre application est internationale, vous devrez vous préoccuper de bien d'autres choses qu'une recherche/remplacement vers nvarchar : textes/messages multilingues, fuseaux horaires, unités de mesure et devises

2 votes

Mais qu'en est-il si vous devez parfois enregistrer un nom étranger, comme José ou Bjørn ?

7 votes

@Qwertie : vous utilisez alors nvarchar. Ce qu'il ne faut pas faire, c'est l'utiliser inutilement. Ces 2 noms sont de toute façon compatibles avec varchar, si je ne m'abuse.

131voto

Joe Barone Points 2412

Utilisez toujours nvarchar.

Dans la plupart des applications, vous n'aurez peut-être jamais besoin des caractères à deux octets. Toutefois, si vous devez prendre en charge des langues à deux octets et que votre schéma de base de données ne prend en charge qu'un seul octet, il sera très coûteux de revenir en arrière et de modifier l'ensemble de votre application.

Le coût de la migration d'une application de varchar à nvarchar sera bien plus élevé que le peu d'espace disque supplémentaire que vous utiliserez dans la plupart des applications.

4 votes

Il est beaucoup plus difficile de revenir en arrière et d'ajouter la prise en charge des textes/messages multilingues, des fuseaux horaires, des unités de mesure et des devises, de sorte que chacun DOIT toujours coder ces éléments dans son application dès le premier jour, TOUJOURS (même si ce n'est que sur votre page d'accueil d'application web) !

87 votes

Qu'en est-il de la taille de l'index, de l'utilisation de la mémoire, etc. Je suppose que vous utilisez toujours int alors que vous pourriez aussi utiliser tinyint "juste au cas où" ?

0 votes

@KM votre remarque n'a pas de sens par rapport à la question et à la réponse, mais c'est quand même quelque chose de très important à prendre en compte.

63voto

Thomas Harlan Points 487

Soyez cohérent ! L'association d'un VARCHAR à un NVARCHAR a un impact important sur les performances.

124 votes

Si vous effectuez des jointures sur des champs de caractères, votre base de données présente probablement des problèmes plus graves que l'utilisation de nvarchar ou de varchar, de manière générale.

0 votes

Thomas Harlan Un simple test me montre qu'il n'y a pas de différence tangible entre le fait d'adhérer à l'Union européenne et celui d'y adhérer à l'Union européenne. nvarchar a varchar contre la conversion nvarchar a varchar et en rejoignant varchar . À moins que vous ne vouliez parler de cohérence dans les types de données des colonnes, et non dans les jointures.

2 votes

@ajeh et Thomas : 1) Les tests "simples" sont souvent trompeurs car ils ne couvrent pas les variations qui causent des différences de comportement. 2) Si l'on constate une baisse drastique des performances lorsque l'on mélange VARCHAR y NVARCHAR qui devrait être due à l'indexation de l'article VARCHAR ainsi que le type de collation utilisé pour cette colonne (et donc l'index). Je couvre ce sujet en détail dans l'article de blog suivant : Impact sur les index lors de la combinaison des types VARCHAR et NVARCHAR .

49voto

Cade Roux Points 53870

Nvarchar va entraîner des frais généraux importants en termes de mémoire, de stockage, d'ensemble de travail et d'indexation, de sorte que si les spécifications l'imposent, il sera vraiment possible de le faire. jamais ne soit pas nécessaire, ne vous donnez pas la peine de le faire.

Je n'appliquerais pas de règle stricte "toujours nvarchar" car cela peut être un véritable gaspillage dans de nombreuses situations - en particulier pour l'ETL à partir d'ASCII/EBCDIC ou pour les colonnes d'identifiants et de codes qui sont souvent des clés et des clés étrangères.

D'un autre côté, il existe de nombreux cas de colonnes pour lesquels je m'assurerais de poser cette question dès le début et, si je n'obtenais pas de réponse claire et rapide immédiatement, je ferais en sorte que la colonne soit nvarchar.

23voto

WebMasterP Points 430

Pour votre application, nvarchar convient car la taille de la base de données est faible. Dire "utilisez toujours nvarchar" est une simplification excessive. Si vous n'avez pas besoin de stocker des choses comme des Kanji ou d'autres caractères bizarres, utilisez VARCHAR, cela prendra beaucoup moins de place. Mon prédécesseur à mon poste actuel a conçu quelque chose en utilisant NVARCHAR alors que ce n'était pas nécessaire. Nous l'avons récemment remplacé par VARCHAR, ce qui nous a permis d'économiser 15 Go sur cette seule table (sur laquelle il y avait beaucoup d'écritures). En outre, si vous avez ensuite un index sur cette table et que vous souhaitez inclure cette colonne ou créer un index composite, vous venez d'augmenter la taille de votre fichier d'index.

Réfléchissez simplement à votre décision ; en matière de développement SQL et de définition des données, il semble qu'il y ait rarement une "réponse par défaut" (autre que d'éviter les curseurs à tout prix, bien sûr).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X