Jointures SQL vs Table Unique : Différence de Performance?
Je suis en train d'essayer de coller à la pratique de la conservation de la base de données normalisée, mais qui mène à la nécessité d'exécuter plusieurs requêtes de jointure. Est-il une dégradation des performances du si de nombreuses requêtes, utilisez des jointures vs avoir un appel à une seule table qui peut contenir des données redondantes?
Vous devez vous connecter pour publier un commentaire.
Garder la Base de données normalisée JUSQU'à ce que vous avez découvert un goulot d'étranglement. Alors qu'après un profilage vous denormalise.
Dans la plupart des cas, avoir une bonne couvrant l'ensemble d'indices et statistiques, à jour, permettra de résoudre la plupart des performances et des problèmes de blocage, sans dé-normalisation.
À l'aide d'une table unique pourrait conduire à une dégradation des performances si il y a écrit ainsi que le lit contre elle.
Michael Jackson (pas que) est célèbre censé l'avoir dit,
Qui était probablement avant Sgbdr ont été autour, mais je pense qu'il aurait étendu les Règles pour les inclure.
Multi-table Sélectionne sont presque toujours nécessaire avec un modèle de données normalisé; comme c'est souvent le cas avec ce genre de question, la réponse "correcte" de la "denormalise?" question dépend de plusieurs facteurs.
SGBD plate-forme.
La performance relative de la multi - vs à table unique de requêtes est influencée par la plate-forme sur laquelle votre demande de vie: le niveau de sophistication de la requête optimisateurs peut varier. MySQL, par exemple, dans mon expérience, est hurlement rapide sur l'unique table de requêtes, mais n'a pas d'optimiser les requêtes avec plusieurs jointures si bien. Ce n'est pas un réel problème avec les tables plus petites (moins de 10K lignes, par exemple), mais fait vraiment du mal avec les grands (10M+) ceux.
Volume de données
Sauf si vous êtes à la recherche à des tables dans les 100K+ ligne de la région, il y a assez beaucoup ne devrait pas être un problème. Si vous êtes en train de regarder le tableau des tailles dans les centaines de lignes, je n'aurais même pas pris la peine de penser à propos de l'indexation.
(De-)normalisation
Le point de l'ensemble de la normalisation est de minimiser la duplication, de veiller à ce que toute valeur de champ qui doit être mis à jour seulement besoin d'être changé en un seul endroit. Dénormalisation des pauses, ce qui n'est pas beaucoup d'un problème si des mises à jour pour les données dupliquées sont rares (dans l'idéal, ils ne devraient jamais se produire). Donc réfléchir très attentivement avant de les dupliquer rien, mais la plupart des données statiques, Notez que votre base de données peut croître de manière significative
Exigences/Contraintes
Ce que les exigences de performance sont que vous essayez-vous à répondre? Avez-vous de matériel fixe ou un budget? Parfois un gain de performance peut être plus facilement - et même très bon marché, qui est obtenue par une mise à niveau du matériel. Ce que les volumes de transactions sont en attendez-vous? Un petit-comptabilité d'entreprise système, a un profil très différent, par exemple, Twitter.
Une dernière pensée me frappe: si vous denormalise assez, comment est votre base de données différentes à partir d'un fichier plat? SQL est superbe pour les données flexible et multi-dimensionnelle retieval, mais il peut être un ordre de grandeur (au moins) plus lent qu'une suite séquentielle ou assez simplement de fichiers indexés.
Santé mentale différence.
Nous laisser une requête d'optimisation jusqu'à la base de données pour les mêmes raisons, nous quittons le code de l'optimisation à la compilation.
Plus modernes RDBMSes sont très bonnes, à cet égard, ces jours-ci.
Avant que vous pensez que la dénormalisation est " ok " dans certains cas, pensez à ceci: normalement, vous ne sont pas intéressés dans chaque attribut. Par conséquent, le chargement des données inutiles sur la disquette, est inefficace (généralement moins efficace de la composante de la base de données). Cela peut être bien pire si vous avez un denormalised design, avec beaucoup de données redondantes dans une rangée. Pire encore si vous devez mettre à jour tous que les données redondantes. Il peut être beaucoup plus efficace de charger quelques tables étroites contenant uniquement les colonnes de l'intérêt et de se joindre à eux. Encore une fois, cela dépend de la base de données, sans profilage vous n'avez aucune idée.
Si vous êtes vraiment inquiet à propos de la performance, vous êtes probablement parler des problèmes d'évolutivité. Dans ce cas, vous voudrez peut-être regarder à sharding, pour lesquels des bon (normalisé) schéma de conception est importante.
Il y a un coût à la décomposition des tables pour le bien de la normalisation. Il est un élément de la performance de ce coût. Le coût de la décomposition de tables et de rejoindre des données dans les requêtes peuvent être maintenus bas par: à l'aide d'un bon SGBD; de la conception de tables de droite; la conception d'index droit; laisser l'optimiseur de faire son travail; et réglage de la SGBD caractéristiques spécifiques de la conception physique.
Il y a aussi un coût pour la composition des tables de grande taille qui se matérialisent rejoint. Le coût en termes de mise à jour des anomalies et des difficultés de programmation est décrite dans bon tutoriels sur la normalisation. Il y a également une incidence sur les performances de la composition des tableaux. Dans de nombreux SGBD produits, le chargement d'une très grande ligne dans la mémoire des coûts plus que le chargement d'une ligne plus petite. Lorsque vous composez très grandes tables, vous vous retrouvez en forçant le SGBD pour lire les très grandes lignes, seulement pour jeter plus de la lecture de données dans la mémoire. Cela peut vous ralentir encore plus que la normalisation n'.
En général, ne pas éliminer au hasard. Si nécessaire, utiliser une conception de la discipline qui a été testé par des gens qui ont vécu avant vous, même si cette discipline des résultats dans certaines de dénormalisation. Je vous recommande de schéma en étoile, en tant que telle discipline. Il a beaucoup de choses pour elle. Et il y a encore beaucoup de situations où une conception normalisée fonctionne mieux qu'une conception de schéma en étoile.
L'apprentissage de plus d'un ensemble de principes de conception et d'apprentissage à utiliser est la deuxième étape de l'apprentissage d'être un expert.
Avec les index appropriés mis en place, votre jointures peuvent effectuer très rapidement. Utilisation du générateur de profils SQL afin de déterminer quels indices doivent être créées ou modifiées pour optimiser les performances de vos requêtes. Assurez-vous d'avoir un plan de maintenance pour votre base de données pour exécuter une fois par semaine (ou tous les jours pour les tables qui changent beaucoup) qui met à jour vos statistiques et les index.
La normalisation est normalement préférable de conserver les données dans de multiples endroits. Il existe des scénarios où insertion/mise à jour n'a pas besoin de se produire rapidement et sélectionnez besoin de se produire très rapidement dans ce cas, vous pourriez être mieux sans normalisation. De même, l'optimisation prématurée est pas recommandé, pour aller avec une structure normalisée en premier.
L'un des ultimes hyperoptimizations disponibles à travers les nuages sites est, en fait, à l'aide d'un plus petit nombre de la plus large, de capacité limitée des tables pour plus d'efficacité. Jusqu'à présent, dans l'avenir, si vous avez besoin d'sauvagement échelle, c'est à sens unique. Mais il n'est pas souhaitable pratique pour n'importe quel sgbd relationnel (ceux qui ne le sont pas).
Si vous rencontrez des problèmes de performances, il y a beaucoup de choses à travailler sur le premier, avant toute sorte de dénormalisation.