La Performance de la chaîne de comparaison vs int rejoindre en SQL
Il est admis que la recherche d'une table sur une colonne int est plus rapide que sur une colonne de type chaîne (dites de type varchar).
Cependant, si j'ai un t-Shirt de la table avec une colonne de Couleur, serait-il plus performant pour créer une table des Couleurs avec la clé primaire de cette table étant la clé étrangère sur la Chemise de la table? Serait la jointure de nier l'avantage d'avoir de la valeur dans la colonne de Couleur de t-Shirt étant un int au lieu d'une chaîne de valeur tels que les "Verts" lors de la recherche pour les Chemises vertes?
Est-ce un réel problème de performance? Il ressemble beaucoup à l'optimisation prématurée. Prenez de moi: des bases de données Complexes ne sont pas amusant. Ne pas faire de votre base de données plus complexes, à moins que vous n'ayez une bonne raison.
C'est pas un problème de performance, c'est théorique. Au moins dans mon cas c'est. Cependant, votre commentaire semble voler dans le visage de tous la normalisation des réponses données pour une performance théorique de la question.
La normalisation est une raison valable pour le faire, mais votre question est une question de rendement, c'est ce que mon commentaire était sur. Performance théorique n'est pas quelque chose de la peine de s'inquiéter au sujet de.
C'est pas un problème de performance, c'est théorique. Au moins dans mon cas c'est. Cependant, votre commentaire semble voler dans le visage de tous la normalisation des réponses données pour une performance théorique de la question.
La normalisation est une raison valable pour le faire, mais votre question est une question de rendement, c'est ce que mon commentaire était sur. Performance théorique n'est pas quelque chose de la peine de s'inquiéter au sujet de.
OriginalL'auteur RobertMGlynn | 2012-09-14
Vous devez vous connecter pour publier un commentaire.
Par rapport aux autres opérations en cours, il est peu probable qu'il y a beaucoup de différence de performances entre les deux approches. Si vous avez seulement une poignée de couleurs (jusqu'à quelques centaines), la table des couleurs tient sur une seule page, dans la plupart des bases de données. Un indice sur la couleur ferait regarder très vite et n'encourra aucune activité d'e/S (après la première manche de chargement de la page).
Une comparaison de chaînes de caractères dépend de la base de données, mais il implique une fonction et de la lecture des données à partir de la page. Donc, il n'est pas libre. Différentes bases de données, bien sûr, peuvent avoir différentes caractéristiques de performance pour une fonction de chaîne.
Où il doit être entreposé doit être fonction de votre application. Disons que vous avez une application où la couleur va être présenté à l'utilisateur. Vous pourriez, un jour, souhaitez afficher le nom de la couleur en espagnol, le Swahili ou le Chinois. Si donc, en ayant un tableau fait de cette internationalisation beaucoup plus facile. Plus prosaicly, vous pourriez vouloir empêcher "que grene" la saisie, le cas échéant, d'avoir un tel tableau permet d'une liste de sélection plus facile.
D'autre part, si l'exécution est votre seul souci, il n'a pas d'autre. Dans d'autres cas, il est effectivement possible pour une table de recherche pour être plus rapide qu'une table dénormalisée. Cela se produit lorsque les chaînes sont longues, l'augmentation de la longueur de chaque enregistrement dans une table plus grande. Les grandes tables signifie plus de pages, qui prennent plus de temps à se charger en mémoire.
OriginalL'auteur Gordon Linoff
Si je comprends bien, vous demandez lequel de ces deux requêtes serait plus rapide:
vs
Il dépend un peu sur la base de données (enfin ... peut-être un lot en fonction de si il optimise correctement, ce qui la plupart, si pas tous, mais la recherche dans la table de couleurs devrait être négligeable, et puis le reste de l'exécution pourrait utiliser l'entier valeur de recherche et devrait être plus rapide. La partie du traitement en fin de compte serait équivalent à
SELECT * from shirt WHERE colorid=N
. Cependant, je soupçonne que vous n'auriez pas remarquer une différence dans la vitesse, sauf si la table est assez grande. La décision devrait probablement être basée sur le design qui fait le plus de sens (probablement le normalisée).OriginalL'auteur Mark Wilkins
Au-delà de la performance, de créer un tableau de Couleurs rend votre conception mieux normalisé. Donc, un jour, dans l'avenir, lorsque quelqu'un décide que "Dark Blue" devrait maintenant être appelé "Bleu Marine", vous mettez à jour 1 ligne dans la table des Couleurs contre la mise à jour, le nombre de lignes dans votre Chemise de table.
OriginalL'auteur Joe Stefanelli
Le SGBD a la possibilité d'optimiser indicies où il y a un nombre limité de valeurs. Comment dire à sQL pour ce faire, toutefois, je ne sais pas. Il peut comprendre.
commencer un entrepôt de données si des rapports de performance est un problème grave..
Que Joe points, vous voulez que la base de données normalisée que possible. Si vous avez une comptabilité distincte de la fonction, qui a la possibilité de provoquer des problèmes de performances, vous devez exécuter un périodique de transformation (ou de mettre des règles en place pour faire construire en temps réel) une 2ème lecture seule schéma. La première est OLTP et le 2ème OLAP ('entrepôt de données'); de l'importance de ces concepts à avoir à la place si vous allez obtenir sérieux au sujet de vos données.
Si c'est assez important de savoir, de le tester.
Si personne ne vous donne la réponse, la meilleure façon de le faire est de le tester sur votre propre.
(1) faire 2 bases de données
(2), chacune avec un test de votre 2 tables
(3) Sur la base de données simplement rejoint sur la chaîne de la "couleur", et qui utilise pour un FK; l'autre rejoint par int ('colorID')
Remplir chacune avec 2 millions de lignes factices. Exécuter plusieurs requêtes sur chaque, le calendrier 1ère et moyenne séries.
Utiliser une instance sur votre machine de dev de faire passer le réseau de l'image.
Vous devez également démarrer et arrêter l'instance avant de chaque type de test; des trucs restera dans la mémoire intentionnellement SQL peut fournir plus rapidement, mais probablement, de ne pas fausser les résultats de votre test de fonctionnement - où il pourrait ne pas être en mémoire ou mis en cache plus.
OriginalL'auteur FastAl
Il dépend de l'optimiseur de requête vraiment. Votre table de couleurs sera très faible, et c'est probablement basé sur les statistiques de base de données et les plans de requête, il serait probablement complètement chargé en mémoire, de sorte que vous non seulement la négation de la performance coût de la jointure c'est peut être plus rapide. Évidemment, cela dépend du sgbd que vous utilisez, mais plusieurs sgbd peut prendre des indices pour traiter une table dans une manière spéciale.
Un autre +1 pour la Couleur de la table, c'est que si vous avez besoin de changer le nom de la couleur, vous avez seulement besoin de 1 mise à jour par opposition à la modification de la chaîne de valeur pour chaque occurrence.
OriginalL'auteur Carlos Grappa