Dénormaliser pour améliorer les performances ? C'est convaincant, mais ça ne tient pas la route.
Chris Date, qui, en compagnie du Dr Ted Codd, a été le premier promoteur du modèle de données relationnel, a perdu patience avec les arguments mal informés contre la normalisation et les a systématiquement démolis en utilisant la méthode scientifique : il a obtenu de grandes bases de données et des données d'analyse de l'environnement. testé ces affirmations.
Je pense qu'il l'a écrit dans Écrits sur les bases de données relationnelles 1988-1991 mais ce livre a été repris plus tard dans l'édition six de Introduction aux systèmes de bases de données qui est le site Le texte définitif sur la théorie et la conception des bases de données, qui en est à sa huitième édition au moment où j'écris ces lignes et qui devrait rester imprimé pendant des décennies. Chris Date était un expert dans ce domaine lorsque la plupart d'entre nous couraient encore pieds nus.
Il a trouvé ça :
- Certaines d'entre elles sont valables pour des cas particuliers
- Tous ne sont pas rentables pour un usage général.
- Ils sont tous nettement plus mauvais pour d'autres cas particuliers
Tout revient à atténuer la taille de l'ensemble de travail. Les jointures impliquant des clés correctement sélectionnées avec des index correctement configurés sont bon marché, et non coûteuses, car elles permettent un élagage significatif du résultat. avant les rangs sont matérialisés.
La matérialisation du résultat implique des lectures de disque en masse qui sont l'aspect le plus coûteux de l'exercice par ordre de grandeur. L'exécution d'une jointure, en revanche, ne nécessite logiquement que la récupération de l'élément clés . En pratique, les valeurs des clés ne sont même pas récupérées : les valeurs de hachage des clés sont utilisées pour les comparaisons de jointures, ce qui atténue le coût des jointures multi-colonnes et réduit radicalement le coût des jointures impliquant des comparaisons de chaînes. Non seulement une quantité beaucoup plus importante de données peut être mise en cache, mais il y a aussi beaucoup moins de lecture sur disque à effectuer.
De plus, un bon optimiseur choisira la condition la plus restrictive et l'appliquera avant d'effectuer une jointure, ce qui permet d'exploiter très efficacement la grande sélectivité des jointures sur les index à cardinalité élevée.
Il est vrai que ce type d'optimisation peut également être appliqué à des bases de données dénormalisées, mais le type de personnes qui utilisent ces bases de données n'est pas le même. veulent pour dénormaliser un schéma ne pensent généralement pas à la cardinalité quand (si) ils mettent en place des index.
Il est important de comprendre que les balayages de table (examen de chaque ligne d'une table au cours de la production d'une jointure) sont rares en pratique. Un optimiseur de requêtes ne choisira un balayage de table que si une ou plusieurs des conditions suivantes sont remplies.
- Il y a moins de 200 lignes dans la relation (dans ce cas, un scan sera moins coûteux).
- Il n'y a pas d'index approprié sur les colonnes de jointure (si la jointure sur ces colonnes a un sens, pourquoi ne sont-elles pas indexées ? corrigez cela)
- Une coercition de type est nécessaire avant que les colonnes puissent être comparées (WTF ?! Fixez-le ou rentrez chez vous). VOIR LES NOTES DE FIN D'OUVRAGE POUR LE PROBLÈME ADO.NET
- L'un des arguments de la comparaison est une expression (sans index).
Effectuer une opération est plus coûteux que de ne pas l'effectuer. Toutefois, l'exécution de l'opération mauvais d'être obligé d'effectuer des entrées/sorties inutiles sur le disque, puis de rejeter les déchets avant d'effectuer la jointure dont vous avez réellement besoin, est beaucoup plus coûteux. Même lorsque la "mauvaise" opération est précalculée et que les index ont été judicieusement appliqués, la pénalité reste importante. Dénormaliser pour précalculer une jointure - nonobstant les anomalies de mise à jour qui en découlent - est un engagement envers une jointure particulière. Si vous avez besoin d'une différents rejoindre, cet engagement va vous coûter grand .
Si quelqu'un veut me rappeler que le monde évolue, je pense que vous trouverez que des ensembles de données plus importants sur du matériel plus difficile ne font qu'exagérer l'étendue des résultats de Date.
Pour tous ceux d'entre vous qui travaillent sur des systèmes de facturation ou des générateurs de courrier indésirable (honte à vous) et qui s'indignent en tapant sur leur clavier pour me dire qu'ils savent pertinemment que la dénormalisation est plus rapide, je suis désolé mais vous vivez dans l'un des cas particuliers - plus précisément, le cas où vous traitez les données suivantes tous des données, dans l'ordre. Ce n'est pas un cas général, et on peut sont justifiée dans votre stratégie.
Vous êtes pas justifié de le généraliser faussement. Voir la fin de la section des notes pour plus d'informations sur l'utilisation appropriée de la dénormalisation dans les scénarios d'entreposage de données.
J'aimerais également répondre à
Les joints sont juste des produits cartésiens avec un peu de brillant à lèvres.
Quel tas de conneries. Les restrictions sont appliquées le plus tôt possible, les plus restrictives en premier. Vous avez lu la théorie, mais vous ne l'avez pas comprise. Les jointures sont traité comme des "produits cartésiens auxquels s'appliquent des prédicats". uniquement par l'optimiseur de requêtes. Il s'agit d'une représentation symbolique (une normalisation, en fait) pour faciliter la décomposition symbolique afin que l'optimiseur puisse produire toutes les transformations équivalentes et les classer par coût et sélectivité afin de pouvoir sélectionner le meilleur plan de requête.
La seule façon pour l'optimiseur de produire un produit cartésien est de ne pas fournir de prédicat : SELECT * FROM A,B
Notes
David Aldridge fournit des informations complémentaires importantes.
Il existe en effet une variété de stratégies autres que les index et les balayages de table, et un optimiseur moderne les évaluera toutes avant de produire un plan d'exécution.
Un conseil pratique : s'il peut être utilisé comme clé étrangère, alors indexez-le, de sorte qu'une stratégie d'indexation est disponible sur à l'optimiseur.
J'avais l'habitude d'être plus intelligent que l'optimiseur MSSQL. Cela a changé il y a deux versions. Maintenant, il enseigne généralement moi . Il s'agit, dans un sens très réel, d'un système expert, codifiant toute la sagesse de nombreuses personnes très intelligentes dans un domaine suffisamment fermé pour qu'un système basé sur des règles soit efficace.
"Bollocks" a peut-être manqué de tact. On me demande d'être moins hautain et on me rappelle que les mathématiques ne mentent pas. C'est vrai, mais toutes les implications des modèles mathématiques ne doivent pas nécessairement être prises au pied de la lettre. Les racines carrées des nombres négatifs sont très pratiques si vous évitez soigneusement d'examiner leur absurdité (jeu de mots là) et si vous vous assurez de toutes les annuler avant d'essayer d'interpréter votre équation.
La raison pour laquelle j'ai répondu si violemment est que la déclaration telle qu'elle est formulée dit que
Rejoint sont produits cartésiens...
Ce n'est peut-être pas ce qui était prévu, mais c'est est ce qui a été écrit, et c'est catégoriquement faux. Un produit cartésien est une relation. Une jointure est une fonction. Plus précisément, une jointure est une fonction à valeur de relation. Avec un prédicat vide, elle produira un produit cartésien, et vérifier qu'elle le fait est un contrôle de correction pour un moteur d'interrogation de base de données, mais personne n'écrit de jointures sans contrainte dans la pratique parce qu'elles n'ont aucune valeur pratique en dehors d'une salle de classe.
Je l'ai signalé parce que je ne veux pas que les lecteurs tombent dans le vieux piège qui consiste à confondre le modèle et la chose modélisée. Un modèle est une approximation, délibérément simplifiée pour faciliter la manipulation.
Le seuil de sélection d'une stratégie de jointure par balayage de table peut varier selon les moteurs de base de données. Il est affecté par un certain nombre de décisions d'implémentation telles que le facteur de remplissage des nœuds d'arbre, la taille des valeurs clés et les subtilités de l'algorithme, mais d'une manière générale, l'indexation haute performance a un temps d'exécution de k journal n + c . Le terme C correspond à des frais généraux fixes, essentiellement constitués de temps de préparation, et la forme de la courbe signifie que vous n'obtenez pas de gain (par rapport à une recherche linéaire) avant la fin de l'année. n se compte en centaines.
Parfois, la dénormalisation est une bonne idée
La dénormalisation est un engagement envers une stratégie de jonction particulière. Comme mentionné précédemment, cela interfère avec autre stratégies de jointure. Mais si vous disposez d'une grande quantité d'espace disque, de schémas d'accès prévisibles et d'une tendance à traiter tout ou partie de cet espace, le calcul préalable d'une jointure peut s'avérer très utile.
Vous pouvez également déterminer les chemins d'accès que votre opération utilise généralement et précalculer toutes les jointures pour ces chemins d'accès. C'est le principe qui sous-tend les entrepôts de données, du moins lorsqu'ils sont construits par des personnes qui savent pourquoi elles font ce qu'elles font, et pas seulement pour des raisons de conformité aux mots à la mode.
Un entrepôt de données correctement conçu est produit périodiquement par une transformation en masse à partir d'un système de traitement des transactions normalisé. Cette séparation des bases de données d'opérations et de rapports a pour effet très souhaitable d'éliminer le conflit entre OLTP et OLAP (traitement des transactions en ligne, c'est-à-dire saisie des données, et traitement analytique en ligne, c'est-à-dire rapports).
Un point important ici est qu'en dehors des mises à jour périodiques, l'entrepôt de données est lecture seulement . Cela rend caduque la question des anomalies de mise à jour.
Ne faites pas l'erreur de dénormaliser votre base de données OLTP (la base de données sur laquelle se fait la saisie des données). Cela peut être plus rapide pour la facturation, mais si vous le faites, vous obtiendrez des anomalies de mise à jour. Avez-vous déjà essayé de faire en sorte que le Reader's Digest cesse de vous envoyer des articles ?
L'espace disque est bon marché de nos jours, alors faites-vous plaisir. Mais la dénormalisation n'est qu'une partie de l'histoire des entrepôts de données. Des gains de performance bien plus importants sont obtenus grâce à des valeurs cumulées précalculées : totaux mensuels, ce genre de choses. C'est toujours sur la réduction de l'ensemble de travail.
Problème d'inadéquation des types dans ADO.NET
Supposons que vous avez une table SQL Server contenant une colonne indexée de type varchar, et que vous utilisez AddWithValue pour passer un paramètre contraignant une requête sur cette colonne. Les chaînes de caractères C# sont Unicode, donc le type de paramètre déduit sera NVARCHAR, qui ne correspond pas à VARCHAR.
La conversion de VARCHAR en NVARCHAR est une conversion élargie qui se produit donc implicitement - mais dites adieu à l'indexation, et bonne chance pour trouver pourquoi.
"Count the disk hits" (Rick James)
Si tout est mis en cache dans la RAM, JOINs
sont plutôt bon marché. C'est-à-dire que la normalisation n'a pas beaucoup pénalité de performance .
Si un schéma "normalisé" provoque JOINs
de frapper le disque souvent, mais le schéma équivalent "dénormalisé" n'aurait pas à frapper le disque, alors la dénormalisation gagne une compétition de performance.
Commentaire de l'auteur original : Les moteurs de bases de données modernes sont très bons pour organiser le séquençage des accès afin de minimiser les pertes de cache pendant les opérations de jointure. Ce qui précède, bien que vrai, pourrait être interprété à tort comme impliquant que les jointures sont nécessairement coûteuses sur les grandes données. Cela pourrait conduire à une mauvaise prise de décision de la part de développeurs inexpérimentés.
3 votes
Vous examinez également les avantages ;)
0 votes
Je suis à la recherche d'une comparaison objective (si une telle chose existe). Les avantages, les inconvénients, tout ce que vous voulez.
0 votes
Les approches préétablies de l'informatique en nuage reposent sur la possibilité de parier sur toutes les possibilités, en évitant le problème de la "mauvaise jointure". Google a publié quelques livres blancs sur ses propres systèmes. Très intéressant - les moyens d'étendre l'applicabilité des cas particuliers.
0 votes
@PeterWone - pouvez-vous fournir une référence à certains de ces articles ? p.s. pour répondre à la question de votre profil, Android est Open Source - du moins partiellement, donc les geeks ont sauté dans le train en marche. Considérés comme techniquement avancés par le grand public, ils ont été suivis comme des lemmings dans l'étreinte serrée et moite de Google ! Quelqu'un veut-il un Betamax ? Plus près de mon cœur (et de ma génération), comment MySQL (qui n'a jamais été utilisé par les autres) a-t-il été adopté ?
FOREGIN KEY
s FFS) est devenu (et reste) le SGBD "R" le plus populaire au monde alors qu'il était concurrencé par PostgreSQL (pas de version native pour Windows) et Firebird (fiasco de l'opensourcing), ou même SQLite ?0 votes
Inutile de dire que je considère PostgreSQL et Firebird comme étant largement supérieur à MySQL pour les systèmes multi-utilisateurs et à SQLite comme stellaire dans la sphère mono-utilisateur. SQLite gère le site sqlite.org (400 000 visites par jour !).
0 votes
@Vérace - hélas, je n'ai pas pris de notes concernant les documents Google. Je les ai lus en passant lors de la vérification des faits - je suis toujours prêt à envisager des points de vue opposés. Je ne peux même pas me souvenir de mots à la mode pour vous aider à chercher. Tout ce que nous avons est "Google", "2008" et peut-être (seulement une supposition) "big data". J'ai encore des manuels Borland pour Firebird. Je ne suis pas sûr de le tenir en tout à fait le regard que vous semblez avoir, mais je le prendrais sur MySQL tous les jours notamment depuis qu'Oracle a enroulé ses tentacules autour de MySQL. Je considère SQLite comme un système de fichiers relationnel plutôt que comme un serveur, car c'est ainsi que je l'utilise.
0 votes
Petit détail :-) Borland n'a jamais publié de manuels pour Firebird, mais pour Interbase (sur lequel Firebird est basé). AIUI, Inprise (un Borland renommé) a ouvert la source d'Interbase, mais a rapidement fait marche arrière et a refermé la source, mais pas avant que certains développeurs dans l'écosphère d'Interbase aient repris le code MPL et l'aient utilisé pour former le projet Firebird. Confus ? Peut-être, mais pas autant que la "direction" d'Inprise/Borland... :-) D'où mon utilisation du terme "fiasco" - c'est vraiment dommage, parce que, écoutez bien, ils... avait en fait DRI en 2000, et Les contraintes CHECK (que MySQL toujours n'a pas).
0 votes
S'ils l'avaient mis sous licence GPL à la manière de MySQL, Interbase aurait pu être acheté par Sun pour 1 milliard de dollars (et ensuite Oracle...) ! Ah, bon, sic biscuitus deteriatum ! Merci pour la réponse. Je ne sais pas comment je ferais si on m'interrogeait sur une recherche Google vieille de dix ans !