Comment les colonnes VARCHAR sont-elles traitées en interne par un moteur de base de données? p>
Pour une colonne définie comme Il semble que Char (100) Code>, la SGBD attribue 100 octets contigus sur le disque. Cependant, pour une colonne définie comme varchar (100) code>, ce n'est probablement pas le cas, car l'ensemble du point de varchar code> ne doit pas attribuer plus d'espace que nécessaire pour Stockez la valeur de données réelle stockée dans la colonne. Ainsi, lorsqu'un utilisateur met à jour une ligne de base de données contenant une colonne vide varchar (100) code> sur une valeur composée de 80 caractères, par exemple, où l'espace pour ces 80 caractères est-il attribué? P>
varchar code> Les colonnes doivent entraîner une fausse quantité de fragmentation des lignes de base de données réelles, au moins dans des scénarios où les valeurs de colonne sont initialement insérées comme vide ou null, puis mises à jour ultérieurement avec réel valeurs. Cette fragmentation entraîne-t-elle des performances dégradées sur les requêtes de base de données, par opposition à l'utilisation de valeurs de type CHAR, où l'espace des colonnes stockées dans les lignes est attribué contiguë? Évidemment en utilisant varchar code> aboutit à moins d'espace disque que de l'utilisation de caractères, mais y a-t-il une performance touchée lors de l'optimisation des performances de la requête, en particulier pour les colonnes dont les valeurs sont fréquemment mises à jour après l'insertion initiale? P>
6 Réponses :
Vous faites beaucoup d'hypothèses dans votre question qui ne sont pas nécessairement vraies. P>
Le type de la colonne A dans n'importe quel SGBD ne vous indique rien du tout sur la nature du stockage de ces données, à moins que la documentation ne vous indique clairement comment les données sont stockées. Si cela n'est pas indiqué, vous ne savez pas comment il est stocké et que le SGBD est libre de modifier le mécanisme de stockage de la libération à la libération. P>
En fait, certaines bases de données stockent des champs de caractères en interne en tant que Varchar, tandis que d'autres prennent une décision sur la base de la colonne sur la base de la taille déclarée de la colonne. Certains stocks de base de données Varcharne avec les autres colonnes, certaines avec des données BLOB, et certaines implémentent d'autres stockages, certaines bases de données réécrivent toujours toute la ligne lorsqu'une colonne est mise à jour, d'autres ne le font pas. Certains varcharars permettent de mettre à jour une future mise à jour sans délocaliser le stockage. P>
Le SGBD est responsable de la détermination de la manière de stocker les données et de les renvoyer de manière rapide et cohérente. Il m'ojoute toujours combien de personnes à essayer de penser à la base de données, généralement avant de détecter tout problème de performance. P>
+1: La question suppose également une quantité importante de mise à jour qui élargit les champs Varcharpar. Même ceci peut être - dans certaines applications - un pourcentage de rangement aligné de lignes.
Merci pour les réponses. Ma question de base était la manière dont les DBMS stockent des données de longueur variable et les réponses ont mis la lumière sur celle-ci pour moi. La DB en question présente un certain nombre de colonnes quelque peu grandes qui sont initialement vides sur insertion et remplies ultérieurement, mon préoccupation générale était donc la manière dont cela est traité par le SGBD et des problèmes de performances possibles en raison de l'obstacle au disque VS en utilisant des caractères.
@E. Dépend entièrement de votre SGBD, et il est possible qu'ils ne peuvent pas publier ces informations. Cependant, la plupart des DBMS modernes sont conscients des problèmes tels que la fragmentation des données et comprennent des optimisations pour éviter toute perte de performance. Sauf si vous détectez un problème de performance, je laisserais la base de données le gérer pour vous. (À une hypothèse, j'imagine que la plupart des DBMSE écrivent la rangée sur le stockage en cours si elle s'adapte, ou dans un nouveau stockage s'il ne le fait pas, libérant l'ancien stockage, avec plus ou moins la même performance dans Cas).
La réponse dépendra de la SGBD spécifique. Pour Oracle, il est certainement possible de se retrouver avec une fragmentation sous la forme de «lignes chaînées» et qui entraîne une pénalité de performance. Cependant, vous pouvez atténuer contre cela en pré-attribuant un espace vide dans les blocs de table pour permettre une expansion due à des mises à jour. Cependant, les colonnes de charcuterie rendront généralement la table beaucoup plus grande, ce qui a son impact propre sur la performance. Char a également d'autres problèmes tels que des comparaisons pavés vierges qui signifient que, à Oracle, l'utilisation du type de données de caractère est
Votre question est trop générale car différents moteurs de base de données auront un comportement différent. Si vous avez vraiment besoin de le savoir, je vous suggère de créer un point de repère pour écrire un grand nombre d'enregistrements et de l'heure. Vous voudrez suffisamment d'enregistrements pour prendre au moins une heure pour écrire. P>
Comme vous l'avez suggéré, il serait intéressant de voir ce qui se passe si vous écrivez insérez tous les enregistrements avec une chaîne vide (""), puis mettez-les à la mise à jour pour avoir 100 caractères raisonnablement aléatoires, pas seulement 100 xs. p>
Si vous essayez cela avec SQLite et ne voyez pas de différence significative, je pense qu'il est peu probable que les plus grands serveurs de base de données, avec toutes les analyses et le réglage qui se produisent, seraient pires que SQLite. P>
SQLite est un exemple parfait de ce que je disais dans mon commentaire ci-dessus, de ne pas connaître le mécanisme de stockage pour les données. Sous la cagoule, SQLite n'a même pas de stockage dactylographié - vous pouvez insérer des données de type VARCHAR dans n'importe quel type de colonne (même entier).
La question est que cela fait-il une différence pour la performance? Seul un test racontera à coup sûr. D'une part, les développeurs de logiciels ont peut-être compris le potentiel de fragmentation et l'atténuer d'une manière ou d'une autre. Pour un autre, le rembourrage supplémentaire de caractères de longueur fixe entraînera probablement plus d'E / S de fichier, mais cela peut également être atténué. Vous devez comparer les variations afin de savoir s'il existe une différence significative.
dans SQL Server Varchar (sauf Varcharchar (Max)) est généralement stocké avec le reste des données de la ligne (sur la même page si les données de la ligne sont <8kb et dans la même mesure si elle est <64 Ko. Seul le Les grands types de données tels que le texte, le NTEXT, l'image, Varhcar (Max), Nvarhcar (MAX), XML et Varbinary (Max) sont stockés séparément. P>
Les structures de données utilisées à l'intérieur d'un moteur de base de données sont beaucoup plus complexes que votre crédit informatique! Oui, il existe des problèmes de fragmentation et de problèmes dans lesquels la mise à jour d'un Varcharne avec une valeur importante peut entraîner une touche de performance, mais il est difficile d'expliquer / comprendre quelles sont les conséquences de ces problèmes, sans une compréhension plus complète des données de données impliquées. P>
Pour MS SQL Server, vous pouvez commencer par la compréhension des pages - l'unité de stockage fondamentale (voir http://msdn.microsoft.com/en-us/library/ms190969.aspx ) P>
En termes de performances des implications des correctifs VS Types de stockage variable sur les performances Il existe un certain nombre de points à prendre en compte: P>
Comme vous pouvez le constater, la situation est plutôt complexe - de manière générale, cependant, vous pouvez faire confiance au moteur de base de données pour être très utile pour traiter des types de données variables et qu'il devrait être le type de choix de données lorsqu'il peut y avoir une variance significative de la longueur des données détenues dans une colonne. p>
À ce stade, je vais également recommander l'excellent livre "Microsoft SQL Server 2008 Internals" pour plus d'informations sur la manière dont des choses complexes comme celle-ci obtiennent! p>
Cela va être complètement spécifique à la base de données. p>
Je sais que dans Oracle, la base de données réservera un certain pourcentage de chaque bloc pour les futures mises à jour (le paramètre PCTFree). Par exemple, si pctFree est défini sur 25%, un bloc ne sera utilisé que pour de nouvelles données jusqu'à ce qu'elle soit pleine de 75%. En faisant cela, il reste que des rangées se développent. Si la rangée pousse de manière à ce que l'espace réservé à 25% soit complètement utilisé, vous vous retrouvez avec des lignes chaînées et une pénalité de performance. Si vous constatez qu'une table comporte un grand nombre de lignes chaînées, vous pouvez accorder le PCTFREE pour cette table. Si vous avez une table qui n'aura jamais de mises à jour, un PCTFree de zéro aurait un sens p>