IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Exercice SGBD optimisation


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Exercice SGBD optimisation
    Bonjour à tous,

    On m'a soumis un exercice concernant les bases de données.
    J'ai beau chercher, je ne comprends pas le résultat.

    On a deux bases de donnée avec les même tables et les même données dedans.
    Seule la table 'toto' diffère
    Pour la 1ere base de donnée : le champ A (integer) est déclaré comme clef primaire.
    Pour la 2eme base de donnée : il n'y a pas de clef primaire.

    On réalise la requête suivante sur chacune des deux bases:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explain ANALYZE select * from toto where A*12=420;
    Les "counts" sont identiques.
    Temps de réponse pour la 1ere base : 7 secondes (seq scan)
    Temps de réponse pour la 2eme base : 0.7 secondes (seq scan)


    J'ai beau chercher, je ne comprends pas pourquoi il y a un écart de temps de réponse si différent.

    Est-ce que quelqu'un aurait une explication et/ou une référence sur ce sujet ?

    Merci,
    Inarus

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Faut vraiment être prof pour inventer une requête pareille !

    Tu es sûr que c'est la table sans clé primaire qui donne la requête la plus lente ?

    WHERE A*12=420 <==> WHERE A = 35
    Le SGBD doit pouvoir, je pense, transformer la requête et utiliser l'index sur A pour trouver beaucoup plus rapidement les lignes de clé 35 alors que sans index il doit parcourir toute la table.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse .

    Tu es sûr que c'est la table sans clé primaire qui donne la requête la plus lente ?
    Oui , justement c'est cela qui me pose un problème .

    Le SGBD doit pouvoir, je pense, transformer la requête et utiliser l'index sur A pour trouver beaucoup plus rapidement les lignes de clé 35 alors que sans index il doit parcourir toute la table.
    Dans le plan de requête donné , le SGBD fait un seq scan (analyse séquentielle) pour les deux tables (avec ou sans la clé définie).

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il ne faut pas chercher une règle générale à ce comportement.

    Tout du moins, pas au niveau de la structure.

    Cette table est-elle volumineuse ?

    En effet, j'aurais plutôt tendance à dire que si la table est peu volumineuse, le SGBD la charge intégralement en mémoire.

    Par conséquent, index ou pas, la recherche de lignes à partir d'un simple critère sera à peu de chose près aussi rapide, index ou non.

    En revanche, si un index est présent, alors si le SGBD décide malencontreusement d'utiliser ce dernier, alors il va trouver la ligne en deux fois :
    - Une lecture dans l'index (qui va prendre presque autant de temps qu'une lecture dans la table entière si cette dernière est petite et en mémoire)
    - Une seconde lecture dans la table, afin de retrouver les lignes dont le rowid correspond à ceux trouvés dans l'index.

    Et on se rend compte à ce moment que le SGBD travaille deux fois plus s'il utilise l'index.

    Même mieux, si le SGBD est limite en mémoire, il va peut-être charger en mémoire uniquement l'index de la table, et pas la table elle-même, alors qu'il aurait peut-être eu la place de charger la table s'il n'y avait pas eu d'index.

    Cependant, une fois de plus, attention à ne pas tirer de conclusions hâtives et généralistes, car notamment certains SGBD peuvent décider eux-même d'utiliser ou non un index, car ils ne sont pas stupide, et savent qu'un index peut faire perdre du temps sur de petits volumes.

    Après, je suis pas DBA, il y a peut-être d'autres explications.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 534
    Points
    52 534
    Billets dans le blog
    5
    Par défaut
    Tout dépend :
    • du SGBDR utilisé,
    • de son optimiseur,
    • des statistiques (et si elles sont à jour),
    • de la structure de la table,
    • de la volumétrie des données
    • et de la distribution des données !

    Ce qui fait beaucoup de paramètres...
    Bref, cet exercice dans les conditions évoquées est d'une haute stupidité ou bien vous ne nous avez pas assez renseigné sur le problème.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    - Les statistiques sont à jour .

    - La table a une taille de 2000 tuples donc en effet elle n'est pas très volumineuse.

    - Les requêtes ont été effectués grâce à postgres .

    - les coûts sont identiques seul le "actual time " diffère.

    Voilà c'est tout ce que j'ai pu oublier de dire .

    StringBuilder : Est ce lors d'un parcours séquentielle , le SGBD charge toujours l'ensemble de la table en mémoire ?



    voici les informations exactes que je possède à part la taille de la table (2000 tuples) :

    1 ère table (avec clé primaire sur A) :

    Seq Scan on toto (cost=0.00..49.00 rows=10 width=43) (actual time=0.037..23.863 rows=1 loops=1)
    Filter: ((A * 10) = 900)
    Total runtime: 23.888 ms


    2 ème table (sans clé défini) :

    Seq Scan on toto (cost=0.00..49.00 rows=10 width=43) (actual time=0.034..0.567 rows=1 loops=1)
    Filter: ((A* 10) = 900)
    Total runtime: 0.586 ms

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Ca n'a pas de sens.


    Si on part du postulat que les deux bdd :
    - sont sur des serveurs avec archi identique
    - que la conf des deux bases est identique
    - que les deux tables sont identiques
    - que rien n’interfère avec ces bdd


    En faisant un WHERE A/12 = 420 vous court-circuitez la seule possibilité à PostGresql de changer de plan d’exécution ... et du coup d'avoir un temps d'exec différent.

    Les temps devrait donc être presque identique sur vos deux requêtes.

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Deux bases différentes, et les instructions de lancement sont lancées à chaque fois sur la base elle-même ? La différence pourrait venir d'une liaison réseau. Ou bien du temps de parsing si la requête n'est pas en cache, si vous réitérez le select, quel est le temps ? [cela dit, on aura d'autres biais]

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et si, en réinitialisant le serveur, on lance les requêtes dans l'ordre inverse - sans clé d'abord et avec ensuite, les résultats sont-ils identiques ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour l’intérêt que vous portez à mon problème .

    Je vais essayer de faire la requête en réinitialisant la base de données et en faisant les requêtes dans l'autre sens pour voir si cela change ou même inverse les temps.

    Je vous tiens au courant .

Discussions similaires

  1. exercice d'optimisation d'algorithme en c
    Par lisenette dans le forum C
    Réponses: 1
    Dernier message: 07/05/2013, 12h21
  2. Exercices et sujets SGBD
    Par Ralfman68 dans le forum Débuter
    Réponses: 1
    Dernier message: 04/12/2006, 17h48
  3. [SGBD] Optimisation PHP/MySQL
    Par freesurfer dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/04/2006, 13h46
  4. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  5. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo