|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : août 2008 Messages : 26 ![]() |
Bonjour,
Je débute en SQLServer et j’ai quelques interrogations sur les « bonnes pratiques » dont je ne trouve pas vraiment de réponse sur le net. Il ne s’agit pas vraiment de problème technique mais plus de retour d’expérience pour ce qui est bien et pas bien : - Les jointures entre toutes mes tables se font sur des varchar dont la taille varie entre 20 et 250 caractères. Y-a-t-il un réel intérêt de performance à l’ajout de clés générées automatiquement ? Y-a-t-il des contre indication ou problème lié à la génération de clés automatiques. - Apparemment la taille maximum d’un nom de colonne est de 30 caractères, du coup avoir des noms de colonne de 20 caractères pour des raisons de compréhension, semble t’il idiot ou au contraire utile. Y a-t-il des contre-indications à cela ? De même sur les noms de colonne de 1 ou 2 caractères, cela peut-il poser des problèmes ? - Utilisation de varchar(n) ou Text, à partir de quelle valeur de n est-il judicieux d’utiliser un Text plutôt qu’un varchar, si celui-ci ne sert que pour un select. Y-a-t-il mieux que varchar ou text ? Merci de vos réponses. |
|
|
00
|
|
|
#2 | |||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Citation:
- D'abord, si la base de données n'a pas une collation sensible à la casse et aux accents, imaginez la quantité de travail que le CPU et le moteur de base de données doivent abattre pour comparer les clés ... - En termes d'indexation c'est très très mauvais, puisque comme vous pouvez stocker n'importe quelle chaîne (ou presque) dans une table transactionnelle qui référencerait une table maître, alors l'index qui est sur cette table transactionnelle subira de nombreuses "scissions" de page dans l'index, ce qui va ralentir l'exécution de la requête Citation:
- en int vous consommez 4 octets - en bigint vous consommez 8 octets (conseillé si votre serveur est en 64 bits) C'est à dire bien moins que 20 caractères (1 octet par caractère en varchar et deux en nvarchar, plus 2 octets qui indiquent la fin de chaîne). En plus de cela les processeur est bien plus à l'aide avec des entiers qu'avec des chaînes Citation:
Citation:
Pour les noms de colonnes, comme pour les noms d'objets, on proscrit tous les caractères diacritiques (style dollar, accents, ...) et ils ne peuvent pas commencer par un chiffre. Aucun problème pour des noms de colonne à 1 ou deux caractères , on obtient le même comportement qu'avec 128 caractères. Peut-être au niveau de la taille des plans de requête, mais bon là c'est chercher les poils en train de pousser sur les œufs ... Citation:
Pas de valeur explicite, mais à respecter, mais je dirai qu'au delà de 200 caractères, ce n'est peut-être pas un mauvais choix. Rappelez vous qu'une page peut contenir jusqu'à 8060 octets de données utilisateur. Quand vous utilisez varchar(max), la chaîne est stockée dans des pages spécifiques à cet usage, en dehors des pages de la table. La page contient un pointeur vers les pages qui stockent la longue chaîne. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||||
|
10
|
|
|
#3 | |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
Citation:
MS Sql Server est bien plus conciliant sur le coup.
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|
|
|
10
|
|
|
#4 | |||
|
Membre Expert
![]() ![]() |
Citation:
Citation:
Citation:
tu peux utiliser à la place du varchar(max) |
|||
|
10
|
|
|
#5 | ||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
De plus sur 256 caractères que permet le VARCHAR, la plupart sont inexploitable. En dehors des 26 lettres et des 10 chiffres les autres caractères sont soit difficile à manipuler (accents par exemple) soit incompréhensible pour un utilisateur (sensibilité ou non à la casse) soit carrément impossible à taper (la sonnette par exemple, code 7), donc vous ne pouvez exprimer grosso modo que 36 symboles.... quel gâchis ! En revanche avec un entier de 4 octets vous pouvez exprimer 4 milliards de valeur différentes juste en saisissant un chiffre composé de 10 symboles différents tout au plus. En sus ajoutons que la gestion de la collation fait que le CPU passe plus de temps à faire des rapprochement sans tenir compte de la casse ou des accents (tout dépend de la collation que vous avez mis, car je suppose que vous n'avez pas pensé à utiliser une collation binaire). Bref, vous êtres au minimum 10 fois plus lents dans les traitements. Enfin comme la clef primaire est un index cluster, c'est elle qui est utilisée comme repère de ligne pour tous les autres index. Outre la fragmentation de vos clef du fait de l'aléatoirité des nouvelles entrées, tous vos index secondaires vont grossir du fait de la reprise de cette valeur comme repère de ligne. Ce sont aussi vos index secondaires qui vont en pâtir.... Bref, pour pourrir les performances d'une base e données il n'y a pas mieux ! Enfin si vos index sont sémantiques, c'est encore pire.... A lire : http://sqlpro.developpez.com/cours/clefs/ Citation:
Il existe une contre indication si vous avez de très nombreuses insertions massives en parallèle. Mais là faut commencer à y aller très fort. Du genre insertion de 100 000 lignes dans la même table par des processus parallèle en moins d'une seconde..... Je doute que cela vous arrive aujourd'hui et même pour cela il y des des techniques comme la réservation de plages de clefs... Citation:
Citation:
A lire : http://blog.developpez.com/sqlpro/p9...el-difference/ Le type TEXT est d'ailleurs obsolète et les types LOB (Large Object Binary) comme VARCHAR(max), NVARCHAR(max) et VARBINARY(max) ne peuvent pas être manipulés comme des colonnes relationnelles. Par exemple il est impossible de faire un tri (ORDER BY) ou un groupage (GROUP BY) sur un LOB. Bref, j'ai l'impression que vous avez besoin d'une sérieuse mise à niveau sur le sujet. Mon site web, comme mon livre peuvent vous y aider ! Commencez donc par lire ceci : 1) http://blog.developpez.com/sqlpro/p6...-sur-ms-sql-s/ 2) http://sqlpro.developpez.com/SGBDR/ReglesCodd/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||
|
10
|
|
|
#6 |
|
Invité de passage
![]() Inscription : août 2008 Messages : 26 ![]() |
Merci pour toutes vos réponses super détaillées, c'est exactement les informations que je voulais.
![]() Merci aussi pour les liens je vais effectivement étudier tout ça, je crois que j’en ai besoin. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com