|
|||||||
| Optimisations Forum de conseils pour les optimisations des performances SGBD |
|
|
Publicité ' | |||||||||||||||||||||||||
|
|
|
Outils de la discussion |
|
|
#21 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 128 ![]() |
Peut etre est il en train de comprendre l'art de la mécanique !
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
10
|
|
|
#22 |
|
Membre chevronné
![]() Inscription : mai 2006 Messages : 943 ![]() |
Bonjour,
pour l'exemple cité précédemment pour les caractéristiques il est possible de faire une table Moteur une autre des types de caractéristiques et une troisième liant le moteur, 2 le type de caractéristique et 3 la valeur mesurée. Dans ce cas au lieu d'une table on en a 3 et très peu de colonnes comme le préconise SQL PRO. L'avantage est que si vous rajoutez une nouvelle caractéristique vous n'avez pas à modifier la table mais seulement la rajouter dans la table des types de caractéristiques, les trois tables sont liées par des clés Auto numériques . Peut être que c'est une mauvaise méthode étant autodidacte cela fonctionne tout de même. Cordialement |
|
|
00
|
|
|
#23 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Je vais me faire l'avocat du diable, et plussoyer dans la direction de Yanika_bzh :
Pour un événement (commande, facture, etc.) : société d'appartenance achat ou vente type d'événement code état référence externe code catégorie numéro de contrat associé devise type du tiers livré sigle du tiers livré numéro d'adresse de livraison type du tiers facturé sigle du tiers facturé numéro d'adresse de facturé type du tiers commercial sigle du tiers commercial numéro d'adresse de commercial numéro d'événement type du tiers associé sigle du tiers associé date de saisie utilisateur ayant saisi date de validation utilisateur ayant validé date de modification utilisateur ayant modifié date de livraison date d'expédition date de facturation société d'appartenance de l'évènement d'origine achat/vente de l'évènement d'origine type de l'évènement d'origine numéro de l'évènement d'origine nombre d'éditions mode de livraison mode de transport sigle du transporteur sigle du vendeur code analitique mode de règlement délais de règlement quantième du règmement dépôt serveur position fiscale code tva Voilà, 45 champs. Et encore, j'ai pas tout mis, on peut en trouver d'autres si on entre dans le détail ou dans le spécifique. Pour les tiers : société d'appartenance type de tiers sigle du tiers nom du tiers code comptable du tiers nom banque code banque code guichet numéro de compte clé rib mode de règlement délais de règlement quantième de règlement encours maximum période de facturation nombre de copies factures position fiscale code incident date de modification utilisateur ayant fait la modification type de facture famille code barème devise vendeur groupe langue transpoteur mode de livraison mode de transport délais de réappro statut date de gréation Allez, 33 colonnes. Encore une fois, je n'ai pas mis ce qui pouvait être spécifique. Cherchez-moi la dénormalisation là dedans, je suis curieux de trouver quelquechose qui ne soit pas en 1-1 et qui soit potentiellement NULL. |
|
|
00
|
|
|
#24 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Sinon, j'ai arrêté la lecture de l'article au moment de l'exemple sur les téléphones. Il est on ne peut plus mauvais :
1/ Un numéro de téléphone a une taille potentiellement variable (si j'ai des clients à l'internationnal, tous les numéros n'ont pas la même longueur). => J'utilise donc un VARCHAR. Un NULL ne perdra que deux bytes. 2/ Dans ma table téléphonique, vu que potentiellement j'ai beaucoup de tiers, je vais utiliser une clé assez grande (int32 par exemple). Voir pire, la même clé que celle de mon tiers, qui est peut-être un VARCHAR lui aussi. => Je suis donc dans le cas cocasse où ma seconde table prend systématiquement plus de place dans la base que si j'avais laissé mes numéros de téléphone dans la table principale. 3/ Si dans un écran je veux afficher les informations de mon tiers ainsi que les trois numéros de téléphone, je dois faire 2 requêtes de suite, et une boucle pour parcourir mon second résultat afin de mettre le bon numéro en face du bon masque de saisie. Avec ma table "fourre tout", une seule requête aurait suffit, et aucun traitement particulier au moment de l'affichage. 4/ Idem pour les mises à jour. Sans oublier que je vais devoir gérer les cas UPDATE/INSERT pour chaque numéro saisi, avec potentiellement une démultiplication de SELECT ou gestion d'erreures inutiles. 5/ La table des numéros de téléphone va faire en moyenne 2 fois plus de ligne que la table des clients. Si stocker 1,5 champ vide par ligne pose un problème de performances sur la table client, je ne suis pas sûr que rajouter une table deux fois plus grosse vienne changer quoi que ce soit au niveau des performances : les index c'est bien, mais si y'a trop de ligne, ça ramme quand même... Si sur le fond, cet article prèche un convaincu, sur la forme il est à corriger : Moins d'extrêmisme : - La dénormalisation n'est pas toujours plus lourde en termes de taille des données. - La dénormalisation évite souvent des traitements post-requête (ou pré-requête) qui peuvent être lourd. De meilleurs exemples : - La franchement, le coup du des numéros de téléphones, c'est naze. Prends plutôt l'exemple des informations client saisie dans la commande. Un meilleure objectivité : - On ne dénormalise pas toujours parcequ'on ne sais pas ce qu'est une base de données : on s'est souvent posé la question de l'intérêt de la dénormalisation ou non. |
|
|
00
|
|
|
#25 | |||
|
Expert Confirmé
![]() |
Citation:
Citation:
Je serais curieux de voir la tête de vos index recouvrant les téléphones sur votre table client "fourre tout" ![]() Que faites vous le jour ou vous voulez un troisième, 4ème numéro de téléphone? Quant à votre exemple de table avec 45 colonnes... no comment : Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|||
|
|
00
|
|
|
#26 | ||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Citation:
Un VARCHAR avec la valeur NULL dedans, c'est 2 octets. Là, on va avoir systématiquement 4 octets consommés en plus par numéro de téléphone rempli. Le gain de place est donc potentiellement négatif. Dans la base sur laquelle je travaille, j'ai comme clé de mes tiers une clé composite formée d'un NUMBER(38), VARCHAR2(3) et d'un VARCHAR2(12). Grmpf, la clé est déjà plus grosse qu'un numéro de téléphone ! Citation:
Quant à l'avantage d'avoir un seul index plutôt que plusieurs index sur une même table euh... comment dire... A moins d'utiliser Access comme SGBD ensuite ou DBase, je ne vois pas l'intérêt. Au contraire, plusieurs index sur une même table garantissent de meilleurs performances lorsqu'on utilise l'index dédié à ce qu'on recherche... Citation:
Deplus, il y a des tas de moyens très simples à mettre en place pour augmenter le nombre de colonnes d'une table sans modifier le modèle des données. Citation:
|
||||
|
|
00
|
|
|
#27 | |||||
![]() ![]() |
Citation:
Bref, mauvais exemple ! ![]() Citation:
Citation:
Citation:
Quant au détenteur, comme il peut y en avoir plusieurs pour un numéro de téléphone (un numéro de service pour plusieurs personnes dans le service), on peut même faire une table associative entre la table des téléphones et la table des personnes, cette dernière étant une généralisation des personnes morales et des personnes physiques. Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|||||
|
00
|
|
|
#28 | ||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Pour l'ensemble des informations que tu as flagué comme "clé étrangères" : ben oui, c'est bien des clés étrangères. Mais ça n'empêche pas que ça reste une colonne dans ma table...
code société + type tiers + sigle tiers : ce sont des clés étrangères, et ma table des tiers a justement une clé composite. => dis-moi à quoi ça sert d'avoir un numéro auto-incrément ? à part avoir un index pourri ? de toute façon, en interne, la clé est déjà représentée comme un rowid, et les jointures portent sur cette valeur. donc aucun intérêt à rajouter des informations inutiles. pour l'adresse de facturation, ça se voit que tu travailles pas dans la grande distribution. il peut y avoir des adresses différentes par PDL, et même par nature de produits. "numéro d'adresse de commercial". il y a une faute de frappe dedans. il s'agit de l'adresse commerciale. c'est à dire l'adresse d'où provient la commande, l'adresse de l'interlocuteur qui a passé la commande. un évènement a ici pour clé composite son code société, achat/vente, type et numéro. => a nouveau, à quoi sert une clé dénuée de sens, là où une clé composite offrira les même performances en utilisant des champs ayant du sens ? sigle transporteur et vendeur : comme pour les autres tiers, il s'agit bien d'une partie de son identifiant (code société et type de tiers étant déductibles de l'évènement, via une table de paramétrage) dépôt serveur : sigle du tiers dépôt (avec la même règle que les autres tiers), à partir duquel doit partir la machandise. ça sert principalement pour faire des contrôles au niveau de l'assortiment produit, qu'on ne demande pas au préparateur de mettre des produit inexistants dans le dépôt sur le quai de chargement... sinon y'en a qui vont pas être contents. => donc non, t'as pas trouvé un seul élément externalisable. => non, une table commune pour tous les type d'événement est vitale, ces informations sont identiques qu'on soit en devis, commande, livraison, facture, avoir ou retour, transfert inter-dépôt, transfert inter-société, démarques, etc.. Et grace à sa clé composite, elle est aussi performante que si on avait créé une table par société et type d'événement... au détail près que les mêmes requêtes (et binaires, procédure stockées, vues, triggers, etc.) peuvent servir pour des types d'événement différents. les clés en varchar sont aussi performantes que les clé en int (renseigne-toi un peu, on n'est plus en 1970, c'est d'index qui est lu physiquement, et donc le rowid) Si t'es pas convaincu par la modélisation et par les performances, lit la requête suivante, le résultat, et explique-moi comment tu feras mieux que 3 secondes pour obtenir le résutlat avec une table par société/type d'évènement : Sans oublier comment tu feras le jour où t'as un nouveau type d'événement à prendre en charge ? Et une nouvelle société ? Si tu utilises une table commune, t'as l'air malin avec ta clé numérique. Code :
Code :
|
||||
|
|
00
|
|
|
#29 | ||
|
Expert Confirmé
![]() |
Citation:
Citation:
Sérieusement si vous voulez qu'on réponde calmement à vos "réponses" évitez d'être systématiquement agressif surtout quand vous prônez de la part du rédacteur un ton moins affirmatif...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
||
|
|
00
|
|
|
#30 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Au lieu de dire "aïe", montre-moi comment tu vas faire pour faire la requête ci-dessus de façon optimisée ?
En interrogeant 50 tables avec 50 union ? En ajoutant un index... sur la clé composite (utilité de la clé dans ce cas ?) Bref, moi j'attends. Moi j'ai toujours entendu dire qu'une bonne modélisation commençait par ne pas ajouter de l'information inutile. Mettre un ID numérique dans notre cas, c'est rajouter de la donnée pour rien. A aucun moment il sera judicieux de l'utiliser plutôt que la clé composite. |
|
|
00
|
|
|
#31 |
|
Membre chevronné
![]() Administrateur de bases de données Inscription : août 2009 Messages : 407 ![]() |
C'est pas inintéressant en tout cas.
|
|
|
00
|
|
|
#32 | |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Citation:
Mais avoue que depuis que Yanika_bzh a osé mettre en doute la bonne parole de l'article, y'a pas un argument qui tienne réellement la route dans les réponses. Quelques tentatives, certes, mais pas un seul qui soit retenable. Ensuite, quand je lis qu'il ne faut pas mutualiser les tables, et ne pas utiliser de clés composites, excuse-moi, mais ici on parle de SGBD, Oracle, SQL Server, PostgreSQL, pas de DBase IV ou d'Access. J'ai jamais vu un seul cas où une clé composite pouvait provoquer la moindre contre-performance. Au contraire. Dans mon exemple, elle me permet d'utiliser l'index unique de la PK d'une unique table pour récuéprer un ensemble conséquent de lignes. On peut pas faire plus optimisé. |
|
|
|
00
|
|
|
#33 | ||||||||||
![]() ![]() |
[quote=StringBuilder;6222986]
Citation:
Pourquoi cela donnerait-il un index pourri ? Au contraire, cela donne les meilleurs index quand ces clés primaires auto-incrémentées sont référencées comme clés étrangères dans les autres tables ! Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
Parce que si en plus tu pollues ta table avec le bonhomme NULL ! Citation:
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
||||||||||
|
10
|
|
|
#34 |
|
Expert Confirmé
![]() |
Je dis aîe pour la citation que je fais juste au dessus pas pour votre requête.
Le problème ici n'est pas la performance mais l’intérêt d'une telle table? La table est du coups énorme, l'ajout/modification d'une commande (exemple) met à jour tous vos indexes, y compris pour les autres 'types' qui n'ont rien à voir, problème que vous n'auriez pas en éclatant cette table. Vous nous parlez de performances en lecture... quel est le but de la requête? une REPORT? Vous avez des bases OLAP pour ça pourrais je vous répondre... Quid des performances en ajout?en modification voir suppression?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
10
|
|
|
#35 | |
|
Expert Confirmé
![]() |
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
|
00
|
|
|
#36 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Citation:
Donc non, le coût sera le même. Citation:
Un autre exemple plus parlant, c'est de faire le suivit événément : Lorsque je suis sur une facture, je souhaite connaître par quelles étapes elle est passée pour en arriver là. Je peux avoir un flux cde->liv->fac, devis->arbitrage->cde->préparation->liv->fac A ce moment, à nouveau, avec une table par type d'évènement, je vais pleurer quand je vais devoir faire l'écran qui permet à un utilisateur de savoir quelle commande à bien pu générer cette facture, alors qu'ici, une bête requête hiérarchique et c'est bon. Sinon, on peut penser aussi aux écrans de recherche : si je veux la liste de toutes les livraisons de ce jour, si on mutualise la table pour la raison expliquée ci-dessus, sans clé composite, c'est la croix et la banière niveau performances. |
||
|
|
01
|
|
|
#37 | ||
|
Expert Confirmé
![]() |
Citation:
Citation:
ok je vous charrie...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
||
|
|
00
|
|
|
#38 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Ben non, parceque dans un écran de recherche, je peux tout à fait vouloir rechercher tous les événéments de mon client, pas seulement les livraisons.
=> Imagine si j'ai des types d'événements différents correspondant à un flux spécifique (livraison denrées périssables et livraison standard par exemple). Au moment de la facure, je veux pouvoir ajouter à la fois les livraisons de denrés périssables et les livraisons standard. Et là, je suis obligé de me lancer : - Dans du développement spécifique - De la requête spécifique - Des performances amenuisées à grands coups de union dans plusieurs tables Alors qu'avec mon exemple, j'ai juste à chercher tous les élément de vente de ma société dont le type fait partie d'une liste (et dont le tiers est mon client). Ce sera donc le même écran de recherche selon les besoins et les types d'événement, et surtout, la même requête. On y gagne donc à tous les niveaux, y compris en performances. |
|
|
00
|
|
|
#39 | |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 128 ![]() |
Citation:
Je n'ai pas mis en doute la bonne parole de l'article, juste répondu a un intervenant qui jurait qu'une table comporant plus de 20 colonnes ne pouvait exister. J'ai posté un contre exemple, et voila... Concernant votre exemple, il n'est pas du meme type que celui dont je parlais. Dans mon cas, cela concernait les propriétés atomiques. Dans le votre c'est plus lié a une modélisation et une gestion des relations. J'aurai meme fait une entitée "INTERVENANT", liée a vos differents tiers, leur role d'intervention et l'objet sur lequel il intervient (commande, facture, ...). Cela aurait eu pour conséquence de supprimer vos références tiers dans votre table... Mais ce n'est pas le lieu pour debattre sur un modele issu d'un exemple. Concernant l'utilisation de clés primaires ALPHA, j'ai eu affaire a de nombreux projets en contenant. Je n'ai pas remarqué performances immondes et detestables (et pourtant, domaine industriel, pilotage d'automates donc proche du T.R.). Pour les clés il faut surtout se focaliser sur la notion d'immuabilité, plutot que sur les performances présumées (de plus, lors que nous avions réalisé un moteur SGBD en C++ comme projet d'etudes, nous utilisions une table de HASH pour la comparaison stricte, donc ormis le pouilleme de temps de calcul du HASH, et la comparaison de quelques bits supplémentaires, je ne suis pas sur que les gains soient si enormes que cela. La génération d'un auto incrément demande elle aussi un travail processeur, ainsi qu'une gestion stricte de la concurrence), et en ce domaine, l'utilisation d'un clé entiere incrementale est la plus sure (= clé technique qui vous assure que quelque soit les evolutions dans le temps des elements liées a cette clé, les relations perdureront) Bref, pour moi et en gros, la normalisation est un gain dans la qualité du code qui risque d'etre généré, un gain aussi dans l'evolutivité et la maintenance post développement. Il n'en reste que certains projets ancestraux, n'appliquant pas ces principes et ne demandant pas d'évolutions, continuent encore a tourner avec des performances redoutables ! Bien a vous
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
|
10
|
|
|
#40 |
![]() ![]() |
Honnêtement StringBuilder, sortir un exemple concret que seul vous pouvez analyser et utiliser n'a pas énormément d'intérêt, tout simplement parce qu'il est impossible de vous challenger que ce soit sur votre base ou votre applicatif.
Les différents intervenants ont montré que votre modélisation n'est pas parfaite, néanmoins pas parfait n'est pas synonyme de complètement inutilisable et comme Yanika_bzh le concluait précédemment il reste de nombreuses applications très robustes qui ne sont pas normalisées. N'oubliez pas de prendre en compte que SQLPro est très soucieux de la différenciation des modèles physiques (tables) et externes (vue). Je m'avance certainement, mais votre grosse table repartie sur une dizaine de tables et regroupée dans une (ou plusieurs) vue(s) vous donnerait à minima plus de souplesse et probablement plus de performances. Vos problématiques de recherches seraient aussi bien gérées par une vue, les jointures sur des clefs coûtent très peu dès lors que vous avez filtré une table fille sur un certain nombre de critères. Sur le coups des index, s'ils accélèrent les sélections ils ralentissent fortement les mises à jour et suppressions, cherchez dans le forum vous trouverez des exemples de batch qui passent de plusieurs heures à quelques minutes juste par la suppression des index. Enfin sur la performance d'un index en fonction de son type (littéral ou numérique), chez Oracle c'est similaire, chez SQL-Server c'est très différent, il n'y a pas de bonne réponse universelle.
__________________
Email : http://scr.im/waldar |
|
20
|
Copyright © 2000-2013 - www.developpez.com