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 :

Optimisation SQL 300k lignes


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Optimisation SQL 300k lignes
    Bonjour à tous !

    Voilà, j'ai crée récemment un site de statistiques pour un jeu.
    Ce site récupère toutes les 24h les informations sur les joueurs en les historisant dans une table

    Chaque jour à 00:00 après avoir récupéré ces stats, je fais, grâce à la table historique, le calcul de l'évolution en points du joueur.

    Je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    joueur_hist_today.id,
    joueur_hist_today.pseudo,
    (joueur_hist_today.score - joueur_hist_yest.score) as evolution_score
    from
    joueur_hist joueur_hist_today
    inner join joueur_hist joueur_hist_yest on
    joueur_hist_today.id = joueur_hist_yest.id
    and date(joueur_hist_today.date) = date(joueur_hist_yest.date) + INTERVAL 1 DAY
    and date(joueur_hist_today.date) = CURRENT_DATE
    order by evolution_score desc
    limit 3
    On a donc un calcul... Et cette table fait 300.000 lignes maintenant.
    La requête met 19s et prend environ une seconde chaque jour.

    Donc je me suis dit... il y a t'il moyen d'optimiser cette requête ( les INDEX sont normalement déjà en place )

    Merci d'avance

  2. #2
    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
    Quels sont les index posés ?
    Logiquement il faudrait poser un index sur joueur_hist (date, id).
    Mais pour cela, il faudrait aussi que date soit au bon format ... or manifestement là il ne doit pas l'être, puisqu'il y a des transformations dessus - utilisation de "date()" qui doit faire un arrondi ? Je suggère donc d'avoir directement la "date" au bon format. À ce moment là, la requête se ré-écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 
    joueur_hist_today.id,
    joueur_hist_today.pseudo,
    (joueur_hist_today.score - joueur_hist_yest.score) as evolution_score
    from
    joueur_hist joueur_hist_today
    inner join joueur_hist joueur_hist_yest on
    joueur_hist_today.id = joueur_hist_yest.id
    and joueur_hist_yest .date = CURRENT_DATE - INTERVAL 1 DAY
    and joueur_hist_today.date = CURRENT_DATE
    order by evolution_score desc
    limit 3
    Ce qui permet de faire une jointure sur les id entre le scan de l'index (jour J) et le scan de l'index (jour J-1).

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci

    Alors pour la date, elle était en fait dans le bon format, quand je m'étais renseigné sur la fonction CURRENT_DATE j'avais vu un exemple avec ces fonctions dates donc j'ai fait de même et comme cela marchait, j'ai laissé comme ça. Mais comme en fait, la date est déjà formatée j'ai pu enlever ces fonctions.

    Pour les index oui je m'étais renseigné sur quels index poser, et j'avais bien choisi ceux ci pour cette requête.

    J'ai donc fait ces modifications et je gagne 3s sur ma requête.

    Par contre, que veux tu dire par :"Ce qui permet de faire une jointure sur les id entre le scan de l'index (jour J) et le scan de l'index (jour J-1)." ?

    Vu que pour moi c'est ce qui est déjà en place

    Sinon, pour le temps que met la requête, l'opération que je fais dedans est la principale cause, mais je suppose que l'on n'y peux pas grand chose ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Quel SGBD ?
    Y a t'il seulement un score par joueur et par jour ?

    Si oui en fonction du SGBD je verrais plutôt l'utilisation des fonctions de fenêtrage ou une sous-requête dans le SELECT plutôt qu'une auto-jointure.

    Concernant les index Rei Ichido parlait d'1 index sur les 2 colonnes (et pas 1 index pour chaque colonne) est ce vraiment l'existant ?

Discussions similaires

  1. Lancement script Sql en ligne de commande
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/11/2006, 10h27
  2. Optimisation sql
    Par cosmos38240 dans le forum Oracle
    Réponses: 4
    Dernier message: 09/05/2006, 14h04
  3. [Optimisation] SQL et boucles
    Par schnito dans le forum PHP & Base de données
    Réponses: 75
    Dernier message: 24/03/2006, 16h20
  4. Optimisation SQL et ComboBox
    Par Cdx dans le forum Bases de données
    Réponses: 6
    Dernier message: 30/12/2005, 14h04
  5. sql en ligne de commande
    Par meufeu dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/04/2005, 13h39

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