Il est fréquemment conseillé de choisir des tailles de terrain de base de données comme étant aussi strides que possible. Je me demande dans quelle mesure cela s'applique à SQL Server 2005 Y a-t-il d'autres raisons de restreindre la taille des champs Varcharner à coller aussi près que possible de la taille des données? Je pense à p>
arrière-plan: j'aide les intégrateurs de données avec la conception des flux de données dans un système soutenu par la base de données. Ils doivent utiliser une API qui limite leur choix de types de données. Pour les données de caractères, seul Les volumes de données typiques d'une table sont des enregistrements de 1 à 10 Mio avec des attributs jusqu'à 150. Performances de requête ( varchar code> Colonnes: stocker des mots anglais de 10 lettres dans un varchar (255) code> ne prendra pas plus de stockage que dans un varchar (10) code> champ. p>
varchar (n) code> avec n <= 255 est disponible; Char CODE>, NCHAR CODE>, NVARCHAR code> et texte code> ne sont pas. Nous essayons de définir des règles "bonnes pratiques", et la question est arrivée s'il y a un véritable préjudice à utiliser varchar (255) code> même pour des données dans lesquelles des tailles maximales réelles ne dépasseront jamais 30 octets ou ainsi. p>
SELECT CODE>, avec fréquemment étendu où code> clauses) et les performances de récupération côté application sont primordiales. P>
5 Réponses :
Je pense que le plus gros problème est la validation des données. Si vous autorisez 255 caractères pour un nom de famille, vous obtiendrez un nom de famille de 200 caractères de votre base de données. P>
Une autre raison est que si vous autorisez la base de données de contenir 255 caractères, vous devez maintenant prendre en compte cette possibilité dans chaque système qui touche votre base de données. Par exemple, si vous avez exporté dans un fichier de colonne de largeur fixe, toutes vos colonnes devraient avoir une largeur de 255 caractères, ce qui pourrait être assez gênant ou même problématique. C'est juste un exemple où cela pourrait causer un problème. P>
Je pense également que la plantation globale pourrait être un problème. Même si vous êtes autorisé à dépasser les lignes de 8 Ko dans SQL Server 2005, cela est fait de manière légèrement fidâve pouvant avoir une incidence sur la performance - les pages elles-mêmes sont toujours 8K, d'après ce que je me souviens. Donc, si vous utilisez de grandes colonnes partout, vous risquez de dépasser la page 8K. Quelqu'un d'autre en savent plus sur les implications de la performance?
Oui, si vous dépassez la limite d'octets 8060, la plus grande colonne de longueur variable sera déplacée vers un autre emplacement avec un pointeur ajouté à l'enregistrement de page d'origine. Cela ne se produira que si la taille réelle (non la taille déclarée) des colonnes variables la pousse sur les 8060 octets. Si vous allouez Varcharchar (8000) pour plusieurs colonnes, mais ils ne tiennent que quelques caractères de données que vous n'aurez pas ce problème. Cela peut potentiellement arriver cependant.
Merci beaucoup - vous étiez le premier à discuter de la longueur de la ligne, qui était le plus crucial d'informations que j'avais manqué. J'ai marqué la réponse de Thomas comme "correct" car il est plus facile de lire pour les futurs lecteurs.
Une bonne raison est la validation. p>
(par exemple) en Hollande, un numéro de sécurité sociale est toujours de 9 caractères, lorsque vous ne le laisserez plus jamais survenir. p>
Si vous permettriez une raison plus inconnue, vous devrez faire des chèques (que vous ne voudriez autrement pas) de vérifier si cela est long. p>
Intégrité des données - de loin la raison la plus importante. Si vous créez une colonne appelée limites d'indexation et de ligne. Dans SQL Server, vous avez une limite de 8060 octets IIRC. Beaucoup de colonnes de graisse non varchar (max) avec beaucoup de données peuvent rapidement dépasser cette limite. De plus, les index ont un capuchon de 900 octets dans la largeur IIRC. Donc, si vous souhaitez vous indexer sur la colonne Nom de famille et quelques autres contenant de nombreuses données, vous pourriez dépasser cette limite. p> li>
Systèmes de rapport et externes. En tant que concepteur de rapport, vous devez supposer que si une colonne est déclarée avec une longueur maximale de 255, il pourrait avoir 255 caractères. Si l'utilisateur peut le faire, ils le feront. Ainsi, dire: "Cela n'aura probablement pas plus de 30 caractères." n'est même pas à distance la même chose que "il ne peut pas avoir plus de 30 caractères". Ne comptez jamais sur le premier. En tant que concepteur de rapports, vous devez contourner les possibilités que les utilisateurs entreront dans une multiplication de données dans une colonne. Cela signifie soit tronquer les valeurs (et si tel est le cas, pourquoi disposer-vous de disposer de l'espace supplémentaire?) Ou d'utiliser Cangrow pour faire un bon gâchure d'un rapport. De toute façon, vous rendez plus difficile l'intention des autres développeurs de comprendre l'intention de la colonne si la taille de la colonne est si éloignée des données réelles stockées. P> LI>
ol> nom de famille code> de 255 caractères, vous obtiendrez probablement plus que les noms de famille. Vous obtiendrez le prénom, le nom de famille, le deuxième prénom. Vous obtiendrez leur animal de compagnie préféré. Vous obtiendrez "Alice dans le service de la comptabilité avec les cheveux triangulaires". En bref, vous faciliterrez facilement les utilisateurs d'utiliser la colonne comme colonne Notes / Nom de famille. Vous voulez em> la casquette pour empêcher les utilisateurs qui essaient de mettre autre chose qu'un nom de famille dans cette colonne. Si vous avez une colonne qui appelle une longueur spécifique (par exemple, un identificateur de taxe américain est de neuf caractères) mais la colonne est varchar (255) code>, d'autres développeurs se demanderont ce qui se passe et < / em> Vous avez probablement des données de merde aussi. P> li>
L'autre chose est qu'une seule ligne de données est limitée à 8060 octets, et SQL Server utilise la longueur maximale des champs Varcharner pour le déterminer. p>
Référence: http://msdn.microsoft.com/en-us /Library/ms143432.aspx P>
1) lisibilité et support p>
Un développeur de base de données pourrait regarder un champ appelé STATECODE avec une longueur de Varchar (2) et avoir une bonne idée de quel type de données contient le champ, sans même regarder le contenu. p>
2) Reporting P>
Lorsque des données sont sans contrainte de longueur, vous vous attendez à ce que le développeur applique que les données de colonne soient toutes de longueur similaire. Lors de la signalement sur ces données, si le développeur n'a pas réussi à apporter les données de colonne cohérentes, cela rendra la signalement que les données incohérentes sont incohérentes et drôles. P>
3) Stockage de données SQL Server p>
SQL Server stocke des données sur les "pages" 8K et du point de vue de la performance, il est idéal pour être aussi efficace que possible et stocker autant de données que possible sur une page. P>
Si votre base de données est conçue pour stocker chaque colonne de chaîne comme Varcharchar (255), les données "mauvaises" pourraient glisser dans l'un de ces champs (par exemple, un nom d'état peut glisser dans un champ de statut destiné à être de 2 caractères. ), et causer des fissures inutiles et inefficaces de page et d'index. P>