Optimisation d'une requête
InAme19
Messages postés
539
Date d'inscription
Statut
Membre
Dernière intervention
-
InAme19 Messages postés 539 Date d'inscription Statut Membre Dernière intervention -
InAme19 Messages postés 539 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
voilà j'essaye désespérément d'optimiser une requête sans beaucoup de réussite.
je travaille sur des tables de Piwik (un logiciel de statistiques à la Google Analytics, mais l'avantage c'est que l'on a toutes nos données dans des tables.)
But de ma requête: Pour une page d'un site, je voudrai compter le nombre de fois que cette page est lié à N de ses pages suivantes.
Tout d'abord voilà la structure des tables et des champs nécessaires à ma requête:
nom table : log_link_visit_action
clé étrangère: idvisit
champs utilisés: idaction_url, idaction_url_ref
(idaction_url représente l'identifiant d'une page d'un site, et idaction_url_ref l'identifiant de la page précédente par rapport à idaction_url)
nom table : log_visit
clé primaire: idvisit
champs utilisés : idsite, visit_server_date
Voici ma requête:
résultat:
Le résultat de la requête est ce qui est recherché mais son exécution prend 1,9 secondes, ce qui est loin d'être satisfaisant.
Le problème je pense, vient du GROUP BY car il y a plus de 70.000 idaction_url. Mais je ne vois pas comment modifier cette requête pour la rendre plus rapide...
Si une âme charitable pouvait m'éclairer, je lui en serai reconnaissant.
voilà j'essaye désespérément d'optimiser une requête sans beaucoup de réussite.
je travaille sur des tables de Piwik (un logiciel de statistiques à la Google Analytics, mais l'avantage c'est que l'on a toutes nos données dans des tables.)
But de ma requête: Pour une page d'un site, je voudrai compter le nombre de fois que cette page est lié à N de ses pages suivantes.
Tout d'abord voilà la structure des tables et des champs nécessaires à ma requête:
nom table : log_link_visit_action
clé étrangère: idvisit
champs utilisés: idaction_url, idaction_url_ref
(idaction_url représente l'identifiant d'une page d'un site, et idaction_url_ref l'identifiant de la page précédente par rapport à idaction_url)
nom table : log_visit
clé primaire: idvisit
champs utilisés : idsite, visit_server_date
Voici ma requête:
SELECT count( idaction_url ) FROM log_visit lv JOIN log_link_visit_action llva ON lv.idvisit = llva.idvisit WHERE llva.idaction_url_ref =76284 #la page du site ciblée AND ( llva.idaction_url =91013 #les pages suivantes désirées OR llva.idaction_url =91012 OR llva.idaction_url =76285 OR llva.idaction_url =76288 ) AND lv.idsite =2 AND lv.visit_server_date BETWEEN '2010-01-01' AND '2010-05-17' GROUP BY idaction_url ORDER BY count( idaction_url ) DESC
résultat:
count( idaction_url ) 28694 8903 1540 195
Le résultat de la requête est ce qui est recherché mais son exécution prend 1,9 secondes, ce qui est loin d'être satisfaisant.
Le problème je pense, vient du GROUP BY car il y a plus de 70.000 idaction_url. Mais je ne vois pas comment modifier cette requête pour la rendre plus rapide...
Si une âme charitable pouvait m'éclairer, je lui en serai reconnaissant.
A voir également:
- Optimisation d'une requête
- Optimisation pc - Accueil - Utilitaires
- Optimisation découpe panneau gratuit - Télécharger - Outils professionnels
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Requete sql pix - Forum PHP
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
1 réponse
Salut,
Malheureusement, à part deux ou trois bricoles, tu ne pourras guère aller plus loin.
1. indexer toutes les colonnes entrant dans les prédicats de ta requête, seules ou regroupées, je te laisse tester ce qui est le plus rapide sur ta plateforme. Sous Oracle, faire attention à classer les colonnes des plus discriminantes aux moins discriminantes.
2. transformer ton prédicat (llva.idaction_url =91013 or llva.idaction_url =91012 or llva.idaction_url =76285 or llva.idaction_url =76288) en llva.idaction_url in (91013, 91012, 76285, 76288)
3. restreindre l'étendue de ton échantillon pour calculer tes stats : le calcul sur 1 mois sera plus rapide que ton calcul actuel sur 6 mois
Sinon, il faut améliorer le logiciel (version plus récente voire autre plateforme) ou le matériel :-(
Malheureusement, à part deux ou trois bricoles, tu ne pourras guère aller plus loin.
1. indexer toutes les colonnes entrant dans les prédicats de ta requête, seules ou regroupées, je te laisse tester ce qui est le plus rapide sur ta plateforme. Sous Oracle, faire attention à classer les colonnes des plus discriminantes aux moins discriminantes.
2. transformer ton prédicat (llva.idaction_url =91013 or llva.idaction_url =91012 or llva.idaction_url =76285 or llva.idaction_url =76288) en llva.idaction_url in (91013, 91012, 76285, 76288)
3. restreindre l'étendue de ton échantillon pour calculer tes stats : le calcul sur 1 mois sera plus rapide que ton calcul actuel sur 6 mois
Sinon, il faut améliorer le logiciel (version plus récente voire autre plateforme) ou le matériel :-(
Je vais essayer ça ;-)
Pour ce qui est de l'échantillon, oui plus il est petit et plus c'est rapide. Mais mes calculs sont plus intéressant si l'échantillon est plus grand :-/
Et pour ce qui est de l'amélioration logiciel, je ne suis pas en mesure de l'effectuer. En fait j'utilise la dernière version de phpMyAdmin et je n'ai pas le statut requis pour changer les logiciels ou matériels... je ne suis qu'un petit développeur stagiaire :D
Il va peut être falloir que je pense à créer de nouvelles tables pour changer la structure des données et faire en sorte qu'elles soient plus pertinantes à mes besoins.