Actualites  Archives
 Inscription | Plan du site | 7  visiteurs actifs  
  
     A la Une
  Actualités
  Dossiers
  Coin Technique
  Annonces Web
  Référencement

     Diagnostic
  Popularité Site Web
  Positionnement Moteur
  WebPage Alerte
  Positionnement Google

     Archives
  Sélection
  Expérience qui parle
  Internet quotidien
  Tous les dossiers

     Services
  Communiqués de Presse

     Contact
  Nous contacter
  La protection des données personnelles

     Technique
  Merise

     Login
   
    
Inscription

Mot de passe oublié?

 Merise


Merise: 8ème Partie

Il est maintenant temps de regarder comment fonctionne le moteur de la base de donnée et d'optimiser les requêtes SQL. En effet, il est possible de gagner considérablement en ressources machines rien que sur une optimisation du code SQL. Là encore, il n'est pas question de magie, mais de bien comprendre comment cela fonctionne, et d'utiliser à propos les outils choisis, en l'occurrence les bases de donnée, qui sont très coûteuses en ressources systèmes. Bien sur, elles nous rendent de fiers services mais leur utilisation abusive (ou maladroite) peut provoquer de forts ralentissements, voir même crasher le serveur. Il faut donc être très précautionneux de ce que l'on va demander à l'outil. Comme d'habitude, il faut définir une architecture en adéquation avec ses besoins, et l'utiliser le plus à propos possible.

ECONOMISER LA MACHINE, C'EST EN FAIT POUVOIR LUI EN DEMANDER PLUS

Un hébergeur Français bon marché, très populaire chez les informaticiens et proche d'un fournisseur d'accès gratuit à Internet, nous l'a cruellement rappelé à la fin de l'année dernière. Fournissant des hébergements mutualisés (plusieurs sites par machines), il s'est retrouvé avec certains sites reposant intégralement sur des requêtes SQL lourdes voir inutiles, fausses, et surtout lancées à tors et à travers. Certains de ces sites sont devenus un peu connus, ont commencé à faire de l'audience, et ont finalement faillis faire chavirer l'ensemble de la plate-forme d'hébergement. Les bases de données, surchargées, refusaient souvent de se lancer et de répondre aux requêtes, et renvoyaient régulièrement des messages d'erreurs à tous les utilisateurs. Aux heures de pointes, les sites n'étaient parfois même plus consultables. Inutile de dire que la crédibilité d'un site internet affichant des erreurs d'accès à la base SQL est sérieusement entamée, et que de nombreuses personnes ont du reprendre leur développement. Pour que le site Internet tienne la charge quand il commence à être fréquenté, il vaut mieux qu'il repose sur des fondations solides tant matérielles que logicielles. Quant à cet hébergeur, il a du refondre son architecture matérielle, mais a aussi perdu une grande part de sa crédibilité et de sa clientèle...


MODELISONS UN CATALOGUE : REVISIONS DE LA TECHNIQUE...

Système d'Information (SI) : Arborescence en Arbre...

Un garagiste expose sur le Web ses modèles, afin de présenter ses nouveautées et surtout son stock en temps réel (disponibilité de ses modèles). Il utilise ce que l'on appèle un catalogue, sans caddy ni paiement en ligne (ce sont des voitures...), mais avec navigation par catégorie/sous-catégorie, affichage de la fiche-produit de la voiture, et possibilité de recherche par marque de véhicule. Il limite sa fiche produit au nom, au prix, et à la disponibilité de la voiture (on simplifie...). Ce qui donne :

Un Produit possède 1 ou plusieurs Créateurs (marques, fabricants). Un Créateur fabrique 0 ou plusieurs Produits. Ces Produits appartiennent chacun à une et une seule Catégorie. Chaque Catégorie contient 0 ou plusieurs Produits. Enfin, une Catégorie peut avoir 0 ou plusieurs sous-Catégories, chaque Catégorie ayant 0 ou une Catégorie parente.

D'où le MCD :



Qui entraîne le MLDR :

CREATEUR (ID_CREATEUR, NOM_CREATEUR)
FABRIQUE (ID_CREATEUR, ID_PRODUIT)
PRODUIT (ID_PRODUIT, #ID_CATEGORIE, NOM_PRODUIT, PRIX_PRODUIT, DISPONIBLE)
CATEGORIE (ID_CATEGORIE, #ID_PAR_CATEGORIE, NOM_CATEGORIE)


Qui génère le MPD :


POUR SE PROTEGER, IL FAUT BIEN COLMATER LES JOINTURES !!!

Prenons une requête d'extraction toute simple, et regardons ce qu'il se passe : On recherche les modèles disponibles de Véhicules de marques "Peugeot" de type "Décapotable", et leur prix. L'identifiant ID_CREATEUR de "Peugeot" est ici "4", et l'identifiant ID_CATEGORIE de "Décapotable" est "10".

SELECT *
FROM PRODUIT, FABRIQUE
WHERE PRODUIT.ID_CATEGORIE='10'
AND FABRIQUE.ID_CREATEUR='4'
AND PRODUIT.ID_PRODUIT=FABRIQUE.ID_PRODUIT

Regardons maintenant ce que fait le moteur de la base :

1°) Celui interprète la requête ligne par ligne. Pour commencer, il met dans un tableaux tous les éléments de PRODUIT et de FABRIQUE, en faisant ce que l'on appelle un produit cartésien : c'est à dire que pour chaque enregistrement de la première table rencontrée, ici PRODUIT, il mettra en face tous les enregistrements de la seconde table rencontrés un par un, et ce pour chaque ligne. Si PRODUIT contient 250 enregistrements, et FABRIQUE 110, cette table temporaire et intermédiaire comprendra 250*110=27500 lignes.

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit disponible   id_createur id_produit
1 3 103SP 55 000 Y   4 2
1 3 103SP 55 000 Y   4 11
... ... ... ... ...   8 15
... ... ... ... ...   ... ...
1 3 103SP 55 000 Y   33 18
2 10 205 Blue 83 000 Y   4 12
2 10 205 Blue 83 000 Y   4 11
... ... ... ... ...   8 2
... ... ... ... ...   ... ...
2 10 205 Blue 83 000 Y   33 18
etc... etc... etc... etc... etc...   etc... etc...


2°) Puis, il supprime de cette même table temporaire les valeurs de id_catégories différentes de '10'.

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit disponible   id_createur id_produit
2 10 205 Blue 83 000 Y   4 2
2 10 205 Blue 83 000 Y   4 11
... ... ... ... ...   8 15
... ... ... ... ...   ... ...
2 10 205 Blue 83 000 Y   33 18
etc... etc... etc... etc... etc...   etc... etc...


3°) Ensuite, il supprime de cette même table temporaire les valeurs de id_createur différentes de '4'.

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit disponible   id_createur id_produit
2 10 205 Blue 83 000 Y   4 2
2 10 205 Blue 83 000 Y   4 11
... ... ... ... ...   ... ...
etc... etc... etc... etc... etc...   etc... etc...


4°) Enfin, il effectue la jointure demandée, et ne garde que les lignes dont PRODUIT.ID_PRODUIT=FABRIQUE.ID_PRODUIT .

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit disponible   id_createur id_produit
2 10 205 Blue 83 000 Y   4 2
etc... etc... etc... etc... etc...   etc... etc...


5°) Eventuellement, si il le lui avait été demandé, c'est à ce stade qu'il aurait interprété les commandes des instructions GROUP BY, puis HAVING et enfin ORDER BY. Toutefois, il est intéressant de constater que toutes les colonnes sont présentes dans le tableaux, et que l'on a passé en mémoire à peu près 100 fois l'intégralité de la quantité de données contenues dans ces seules tables.

Imaginez un peu si le garagiste avait eu 100 000 Voitures réparties dans 250 Catégories, avec à peu près 970 marques différentes ?


"FÔ PAS GACHER", COMME DIRAIT L'AUTRE...

Reprenons la même requête, mais formulée un poil différemment :

SELECT PRODUIT.NOM_PRODUIT, PRODUIT.PRIX_PRODUIT
FROM PRODUIT, FABRIQUE
WHERE PRODUIT.ID_PRODUIT=FABRIQUE.ID_PRODUIT
AND PRODUIT.ID_CATEGORIE='10'
AND FABRIQUE.ID_CREATEUR='4'

Regardons ce que fais le moteur de la base :

1°) Tout d'abord, il récupère dans un tableaux les éléments de PRODUIT demandés et ceux nécessaires pour la requête, fais pareil pour FABRIQUE, et la jointure étant spécifiée en premier, il ne prend que les lignes dont PRODUIT.ID_PRODUIT=FABRIQUE.ID_PRODUIT .

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit   id_createur id_produit
2 10 205 Blue 83 000   4 2
3 10 Mégane 83 000   8 3
5 15 4L ME 83 000   4 5
... ... ... ...   ... ...
etc... etc... etc... etc...   etc... etc...


2°) Il enlève les lignes dont id_categorie n'est pas égal à '10'

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit   id_createur id_produit
2 10 205 Blue 83 000   4 2
3 10 Mégane 83 000   8 3
... ... ... ...   ... ...
etc... etc... etc... etc...   etc... etc...


3°) Puis celles où id_createur n'est pas égal à '4'

PRODUIT   FABRIQUE
id_produit id_categorie nom_produit prix_produit   id_createur id_produit
2 10 205 Blue 83 000   4 2
... ... ... ...   ... ...
etc... etc... etc... etc...   etc... etc...


4°) Enfin, il ne garde que les colonnes demandées dans la requête, c'est à dire le nom, et le prix.

205 Blue 83 000
... ...
etc... etc...


Si j'avais su, par expérience ou connaissance du contexte, que la clause FABRIQUE.ID_CREATEUR='4' était plus réductrice en terme d'éléments que la clause PRODUIT.ID_CATEGORIE='10' , je l'aurais alors mise avant celle ci, afin de réduire le plus possible le nombre d'éléments stockés en mémoire, et donc les opérations nécessaires pour les tris et traitements ultérieurs.

Il est intéressant de remarquer que pour un obtenir un résultat similaire, on a beaucoup moins tiré sur la machine, qui pourra donc accomplir cette requête un plus grand nombre de fois simultanément, et donc accueillir un plus grand nombre de visiteur sans souffrir...


QUI VEUT ALLER LOIN, MENAGE SA MONTURE

Sans tomber non plus dans l'intégrisme inutile du coupeur de cheveux en 4, il est tout de même très clair que la simple formulation de la requête SQL est lourde de conséquence sur les ressources et le temps machine nécessaire pour sa simple exécution. On peut ainsi citer quelques précautions simples qui allègeront simplement la charge reposant sur le serveur :

  • Mettre les jointures en premier :
    Si n tables, alors (n-1) jointures.


  • Placer les comparaisons les plus restrictives le plus tôt possible :
    cela fera toujours autant de lignes qui ne seront plus en mémoire, et que l'ordinateur n'aura plus à traiter dans le reste de sa requête.


  • EVITER ABSOLUMENT "SELECT * FROM ..." :
    Ne demandez que les colonnes nécessaires, c'est toujours ça de moins à garder en tableaux après la requête, et donc cela économise la mémoire. De plus, si un jour vous déplacez votre code, et que deux colonnes se trouvent inversées dans la nouvelle base, cela n'aura aucune conséquence pour votre développement.


  • Comparer des colonnes de même type :
    Un CHAR(150) est considéré du même type qu'un VARCHAR(150), mais différent d'un CHAR(152) ou d'un VARCHAR(148). Cela oblige le moteur de base de donnée à effectuer des conversions internes.


  • Formuler les clauses de comparaison le plus précisement possible :
    En particulier, éviter de mettre des % partout dans les clauses LIKE, c'est très lourd à traiter...


  • Mettre les identifiants en INT, et en AUTOINCREMENT :
    L'avantage principal de l'autoincrement est que pour chaque création d'enregistrement ne comprenant pas d'office son identifiant, le moteur se charge lui-même de lui en attribuer un [du type max(id) 1], ce qui évite des manipulations supplémentaires.


  • Utilisez des INDEX :
    Mais l'explication, là, ce sera pour la prochaine fois....

A bientôt...

<< Lire la 7ème partie

Stéphane Lambert
http://www.vediovis.fr/

Spécialisé dans le développement Web, Stéphane LAMBERT
a fondé VEDIOVIS PRODUCTIONS en Mai 2000.
Son expérience couvre essentiellement les sites à fortes audiences,
institutionnels ou audiovisuels.

 

Tous droits réservés - Reproduction même partielle interdite sans autorisation préalable

 Imprimer Donner votre avis

Les réactions


mmmmmmmmmmm
par [23.02.2005 16:24 - tetam]
c extraordinaire ce travail

NO COMMENT
par [23.02.2005 13:20 - Salma Bougrini]
Très riche et très bien fait toute mes félicitations.

merci
par [22.02.2005 11:45 - tetam]
c'etait vraiment 1 travail de genie

fantastique
par [16.02.2005 23:17 - humain]
c'est tout simplement génial.Quel effort!!!Dieu te benisse.

bravo
par [15.02.2005 20:05 - raben]
bravo mais mon prof a deja pris les exemples, vais devoir en trouver ailleurs ^^

:o
par [04.01.2005 23:12 - Axe]
Un document de qualité

Excellent Travail
par [04.01.2005 17:05 - Daoud]
Mille Mercis

Excellent travail , claire et précis et un exemple à suivre pour exposer une information de cette qualité
Encore Bravo !

MERCI
par [19.11.2004 09:40 - Steph]
Merci pour ce cours !
Je suis étudiante et cela me fait un support clair et précis parfait !
A quand la partie suivante, puisque les INDEX indiquent : "Utilisez des INDEX :
Mais l'explication, là, ce sera pour la prochaine fois.... " ? :-)

FORMIDABLE !!!
par [28.10.2004 22:29 - Mimi]
C'est vraiment extra de mettre à dispo autant d'explications.
Le travail est remarquablement clair du début à la fin et d'une ( grande )qualité toujours égale.
Bravo.

Un exemple pour tous !!!

Félicitations !

Excellent
par [09.09.2004 17:36 - nen]
Excellent mais tout à fait surprenant. J'en ai plus appris sur les mécanismes de requêtes SQL que sur Merise.
Le travail n'en reste pas moins remarquable en tous points.

merçi
par [15.06.2004 13:51 - Naïma]
Ce que tu donnes est à toi pour toujours. Ce que tu gardes est perdu à jamais.
si tout le monde adopter ce concept...

P.A.R.F.A.I.T
par [06.05.2004 05:49 - Arnaud]
Tout simplement parfait !
Tant au niveau de la vulgarisation-sans toutefois perdre au niveau de la qualitée-, qu'au niveau de votre démarche didactuelle qui est sans conteste "captivante"
J'ai suivit ce cours durant tout une nuit et je ne le regrette pas !
Ca donne envie d'utiliser Merise !!!!

PS : Si vous posséder d'autres articles, je vous serai infiniment reconnaissant si vous pouviez mes donner quelques liens

MAIL : konono@free.fr

Merci d'avance ......

Excellent!!!
par [29.04.2004 18:12 - LANSKY]
Très pratique ce cours sur MERISE qui m'a permi de d'actualiser mon analyse informatique.
Merci pour les efforts que vous faites pour répandre les connaissances dans le monde qui est entrain de se tranformer en un petit village grâce à INTERNET.

REMERCIEMENT
par [25.04.2004 19:54 - xxxx]
SENEGAL
MERCI d'avoir offert de la matière grise au tiers monde

merci mille et mille fois
par [28.03.2004 10:58 - sabrina]
je voudrais te remercie au nom de tous les utulisateurs de ce programme je vous tire chapeau
c'est vraiment extra a merci ,thank you very much

Merci
par [18.02.2004 09:54 - Samy]
Merci de nous avoir fait profiter de ton expérience. C’est un cours qui traite l’essentiel et d’une façon très claire.
Samy

le bien vaincre le mal
par [06.02.2004 16:34 - maroc- yassine]
filicitation
je voudrais te dire q'un seul mot "sup"
vous avez fait de bien pour tous...
merci et bon courage

cours merise
par [06.02.2004 11:23 - leila]
Félicitations a l'auteur . précis, clair concis , pas de superflu . merci pour votre altruisme .

Remerciement
par [04.02.2004 15:36 - MTD]
Bonjour,
Je tiens à vous remercier pour toutes les parties.

MAROC
par [05.12.2003 22:50 - ENNAJEM]
je voudrais te tiens fort au personne charger de

cette information vraiment géniale je suis trés

content de l'avoir enregistrer merci bcp et bon

courage.

SUPER
par [15.07.2003 08:22 - djamy]
Ecoute, j'ai qu'un mot à dire "chapeau".
puis comme l'explication est très clair et interresante j'aimerai bien voir la suite(generalisation, spécialisation, MCT...)
Merci

Grand Merci...
par [15.05.2003 11:09 - Til.B]
Je tiens à féliciter l'auteur car ce cours va bien m'aider pour mon épreuve de BTS IG de demain...

En effet Merise est au programme et j'ai retrouvé dans ce dossier tout ce dont j'avais besoin..!

Encore merci et bonne continuation

attente...
par [15.05.2003 01:38 - lo]
Si si !! vraiment bien!! mais j'attends la suite maintenant!! ;)

BRAVO
par [28.04.2003 03:14 - belnad]
Vos articles sont magnifiques, cela m'a permis de compléter mes connaissances en treme de MERISE, si vous pouvez en faire de même avec les nouveaux concepts(généralisation, spécialisation, merise orienté ogjet) ça sera génial,grand merci....

Merci
par [03.04.2003 14:29 - Nico]
Merci beucoup pour ce site sur Merise.
J'ai quelques notions apprises durant ma formation mais ce site est vraiment très interessant et m'a permis d'éclaircir tous les points qui me semblaient flous dans ce domaine.
Encore MERCI.

avis
par [15.03.2003 17:44 - savon]
Assez clair et bien presenté que demander de mieux
a quand le mct?

une requête
par [06.03.2003 16:26 - framy]
Puis-je avoir des exemples de grands projets menés avec MERISE?
Merci de m'en envoyer à fmkonhawa@yahoo.com

Un guide telechargable
par [04.03.2003 21:42 - hugo]
Stephanie, Felicitation pour cette compilation d'article sur merise. Dommage qu'elle ne soit pas telechargable en un coup.
En ce qui concerne merise, la methode est malheureusement pas passee outre atlantique. Ici, aux states, on parle UML. Peut etre pourait tu consacrer un article ou deux sur ce qui les unies.
Un bonjour de Californie. :-)
lebegue_h@yahoo.com

EXCELLENT
par [05.02.2003 11:40 - SAMIR]
Je trouve ton site Super, ça me sauve la vie d'autant plus j'ia un test demain MERCI!!

Marseille
par [30.01.2003 11:27 - Béné]
Je vous dis tout simplement BRAVO pour ce précieux travail.à bientôt.

Chapeau!
par [08.01.2003 17:41 - fanie007]
Tout simplement génial!!!!!
Félicitations pour ce site extra!!

merise
par [19.12.2002 10:49 - sliman]
Exelent travail c'est tres beau qu'au point on attend avec impatience la suite de l'article la partie 9 Bon courage et merci encore

félicitation
par [04.11.2002 10:43 - franck]
j'étai à la recherche d'exemples sur merise pour structurer un cours .

Explication trés claire

TRés bon travail

Bravo
par [25.10.2002 22:46 - Infoman]
Bravo, rien a dire sur l'ensemble du cours, ca m'a beaucoup aide. Mais, mais eh oui le fameux mais... Si seulement on pouvais avoir le format chargeable ca aurait ete mieux et + souple.
Encore une fois bravo et merci.

PRESTALOG
par [16.07.2002 17:49 - Eric ]
Très bonne synthèse de l'analyse via Merise.
Félicitation.

bravo
par [15.07.2002 16:15 - gilou]
les 8 parties sont vraiment trs interessantes
bravo!!

 
 

Sam-Mag - Un site du réseau ACORUS 1996-2007
© Copyright ACORUS All rights reserved.- Mentions légales

Ce site respecte la loi Informatique et Libertés. Pour en savoir plus sur la protection des données personnelles, cliquez

 
Webmaster