|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
Bonsoir,
J'ai un problème de performance avec une requête sql. Mon script utilise deux tables : table contenant 2 champs : id_table, num_table table_bis contenant 2 champs : id, num (ci-joint une image qui décrit la requête que je voudrai construire). Ma requête actuelle : Code :
Je voudrai modifier la requête pour intégrer une condition sur les 4 premiers caractères du champs num_table (au lieu de tester sur tout le champ num_table) ,j'ai utilisé la méthode substring dans la nouvelle requête . Nouvelle requête : Code :
Avez-vous une solution a mon problème, est-ce qu’il y a un moyen d’optimiser cette requête. Merci d'avance pour votre aide (Je remercie aussi ceux qui ont pris la peine de visiter mon post Youness |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonsoir. Essaies déjà la même requête en effectuant une vraie jointure et pas un produit cartésien pour voir si cela change quelque chose :
Code sql :
|
||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
Je te remercie pour ta réponse.
La requête normal sans substring s'exécute en 0.7 seconde. ma requête prend 77 secondes, et la tienne 70s (moyenne sur quelques requêtes) seconde. y a-t-il une autre solution pour optimiser cette requête? Merci d'avance |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Oui, les index. Tes tables ne doivent pas en avoir notamment sur num_table
|
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
J'ai bien un index sur les num_table et num, et les id sont des primary key
Moi, la seule piste que j'ai ,c'est de créer une nouvelle colonne num_table_bis dans "table", qui contiendra la valeur du champ num_table sur 4 caractères. mais je dois modifier énormément de traitement dans mon appli pour pouvoir mettre à jour ce champs. Merci pour ton aide, n'hésites pas si tu as d'autres solutions. |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Je me suis constitué vite fait une table de 100k enregistrements et une requête similaire se fait en moins d'une seconde substring() ou non.
Peux tu faire un : sur chacune des tables et nous montrer ce que tu obtiens ? |
|
|
00
|
|
|
#7 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
toutes les tables suivent le même model :
exemple table : Code :
Je pense pas que ces conditions rendent la requête plus complexe ( sauf s'il faut les mettre dans un ordre bien précis), j'ai pas mis tout le script pour ne pas compliquer la compréhension du problème, et je rectifie ...ma table contient vers les 600000 enregistrements. |
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Pierre Ingénieur qualité méthodes Inscription : mars 2003 Messages : 3 726 ![]() |
La lenteur constatée vient probablement de la comparaison sur les 4 caractères.
De fait, cette comparaison exige de transtyper la colonne numérique en chaine, puis d'extraire les 4 caractères, puis de comparer avec une autre valeur obtenue par les mêmes opérations. Dès lors, les index ne sont pas utilisés. Une alerte: je ne sais pas comment tu feras avec les valeurs 14500 et 1450 !
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet) ----------------------- Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MPUsus magister est optimus |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour,
certes le substring() doit faire ralentir...mais 70s !! Sur un jeu de test perso, c'est beaucoup plus rapide chez moi. Peux tu nous montrer ta requête complète ? |
|
|
00
|
|
|
#10 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
Merci pour vos réponse
En effet après quelques tests, j'ai constaté la problème est posé lorsque j'intègre une 3 eme table dans dans ma requête. Ci-dessous la requête complète (voir PJ) Code :
La T4 contient une 10 ene de ligne, avec un primary key sur l'id @qi130 : en ce qui concerne le cas d'exemple 14500 et 1450 , un substring me permettra de faire un test que sur les 4 premiers caractères, les autres caractères non pas d'importance (j'utilise un distinct dans ma requête ) Merci |
||
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Essaies ceci pour voir :
Code sql :
|
||
|
|
00
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
ca donne rien
temps d'exécution : - avec substring :104sMerci |
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
As tu essayé avec un LEFT ?
Code :
|
||
|
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
Je viens de tester avec LEFT, temps d'exécution = 104 ( aucune différence avec substring)
est-ce que l'ordre des INNER join et des conditions est important? |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Tu peux tester de remplacer chaque INNER JOIN par STRAIGHT_JOIN en effectuant la jointure avec substring en dernier pour voir
|
|
|
00
|
|
|
#16 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
non, aucune amélioration
est-ce que le problème peut être causé par un problème de limite d'espace disque, de cache...? |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : janvier 2006 Messages : 951 ![]() |
Si substring pose des problèmes débarasse -en toi !
A condition d'avoir des triggers, on a rien en partant de rien. Tu précalcules et tu maintiens une colonne "invisible" qui est maintenue par les trigger que tu indexes et c'est fini des problèmes de jointure lente pour les problèmes sus-cités. Bonne idée ou mauvaise idée?
__________________
PHP fait nativement la validation d'adresse électronique Utilisez le bouton résolu! |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bizarre quand même cette histoire de passer d'un facteur 1 à 100 juste par l'ajout d'une fonction qui plus est rapide logiquement
|
|
|
00
|
|
|
#19 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
Bonsoir,
La seule solution qui me reste c'est de maintenir une nouvelle colonne que je mettrai à jour avec les 4 premiers caractères du champ id_num. L'utilisation d'un trigger sera très couteux puisqu'à chaque création/modification dans la table je dois faire un update sur toutes la tables ( ce qui est énorme vu le nombre d'enregistrements de la table). je prévois de mettre à jour à nouvelle colonne à chaque insertion/update dans mon appli, ca m'évitera de faire des update en masse avec les triggers. |
|
|
00
|
|
|
#20 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2010 Messages : 31 ![]() |
une autre solution, sera de découper la requête en deux parties. et passer le résultat de la première requête à la 2 eme en PHP.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com