Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1706 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Grosse lenteur de left join

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Grosse lenteur de left join

n°463356
Sebastien
Posté le 21-07-2003 à 14:07:32  profilanswer
 

Voila mon probleme.
J'ai deux tables :
 
-telecom_inv_ligne qui reference toutes nos lignes telephoniques et ou elles sont. (1549 enregistrements)
 
-telecom_cegetel qui reference tous les appels passés, le montant de la com et kel type d'appel (fixe/mobile/international etc) (52 947 enregistrements)
 
 
Le but :
Recuperer le numero, le type d'appel, combien d appels passés, le lieu, la somme.
Si je ne veux ressortir que les infos pour les numeros de telephones se trouvant dans cegetel no soucy :
 
SELECT  numero,zone,count(numero),patrimoine,sum(montant)  FROM telecom_inv_ligne inv,                                      telecom_cegetel cg  
where
inv.numero=cg.id_inst
group by numero, zone
 
//547 rows in set (0.65 sec)
 
La ou ca se complique c'est que j'aurais voulu aussi ressortir les numeros de tel qui n'apparaissent pas dans cegetel
Donc j ai commence par faire ca :
SELECT  numero,zone,count(numero),patrimoine,sum(montant)  FROM telecom_inv_ligne inv                          
LEFT JOIN telecom_cegetel cg ON inv.numero=cg.id_inst
group by numero, zone
 
//1899 rows in set (5 min 51.89 sec)
 
Ca va pas du tout vous vous en doutez :-)
 
Voici les explains si vous comprenez quelque chose qui pourrait me servir.
A savoir que numero est clé primaire chez telecom_inv_ligne
et id_inst est index dans telecom_cegetel.
 

Code :
  1. +-------+--------+---------------+---------+---------+------------+-------+-----------------+
  2. | table | type   | possible_keys | key     | key_len | ref        | rows  | Extra           |
  3. +-------+--------+---------------+---------+---------+------------+-------+-----------------+
  4. | cg    | ALL    | ID_INST       | NULL    |    NULL | NULL       | 52947 | Using temporary |
  5. | inv   | eq_ref | PRIMARY       | PRIMARY |       4 | cg.ID_INST |     1 | where used      |
  6. +-------+--------+---------------+---------+---------+------------+-------+-----------------+


 

Code :
  1. +-------+------+---------------+------+---------+------+-------+-----------------+
  2. | table | type | possible_keys | key  | key_len | ref  | rows  | Extra           |
  3. +-------+------+---------------+------+---------+------+-------+-----------------+
  4. | inv   | ALL  | NULL          | NULL |    NULL | NULL |  1549 | Using temporary |
  5. | cg    | ALL  | ID_INST       | NULL |    NULL | NULL | 52947 |                 |

mood
Publicité
Posté le 21-07-2003 à 14:07:32  profilanswer
 

n°463362
Sebastien
Posté le 21-07-2003 à 14:09:51  profilanswer
 

je pars en transfert de competences la, je risque de pas pouvoir donner de precisions tout de suite :-)

n°463539
Sebastien
Posté le 21-07-2003 à 16:11:33  profilanswer
 

Me revoila :-|

n°463625
MagicBuzz
Posté le 21-07-2003 à 17:00:23  profilanswer
 

Euh...
 
Est-ce que tu peux dire exactement ce que tu veux faire ?
 
Moi chuis très pragmatique, mais aussi terre à terre.
 
Pour moi, "left join", ça veut rien dire du tout. (d'autant plus que 90% du temps, une bidouille de derrière les fagots évite d'utiliser des instructions lourdes, donc faut pas s'enfermer dans un terme matheux qui ne veux rien dire, juste savoir formuler sa question - à soit-même en premier ;))
 
En fait, je vois pas ce que tu récupère dans ta requête quand tu ne prends pas que les cegetel... Y'a pas de montants renseignés ni rien si ?

n°463627
MagicBuzz
Posté le 21-07-2003 à 17:01:18  profilanswer
 

PS: et préfixe le nom de tes tables dans ta requête, je vois même pas qui est où.

n°464348
Sebastien
Posté le 22-07-2003 à 10:17:30  profilanswer
 

SELECT  inv.numero,cg.zone,count(inv.numero),inv.patrimoine,sum(cg.montant)  FROM telecom_inv_ligne inv,                                      telecom_cegetel cg  
where
inv.numero=cg.id_inst
group by inv.numero, cg.zone

n°464368
Sebastien
Posté le 22-07-2003 à 10:29:18  profilanswer
 

Voila un exemple concret
requete 1

Code :
  1. +-----------+------------------+-------------------+------------+-----------------+
  2. | numero    | zone             | count(inv.numero) | patrimoine | sum(cg.montant) |
  3. +-----------+------------------+-------------------+------------+-----------------+
  4. | 14061**** | Fixe vers mobile |              5738 | ET90***    |      3061.11000 |
  5. | 14061**** | Internationale   |                23 | ET90***    |        50.48000 |
  6. | 14061**** | Locale           |              6673 | ET90***    |       576.44000 |
  7. | 14061**** | Nationale        |              8489 | ET90***    |       783.10000 |
  8. | 14065**** | Locale           |                48 | ET90***    |         1.09000 |
  9. +-----------+------------------+-------------------+------------+-----------------+


 
REquete 2

Code :
  1. +-----------+------------------+-------------------+------------+-----------------+
  2. | numero    | zone             | count(inv.numero) | patrimoine | sum(cg.montant) |
  3. +-----------+------------------+-------------------+------------+-----------------+
  4. | 14132**** | Null             |                   | ET40***    |         0.00000 |
  5. | 53623**** | Null             |                 0 | ET01***    |         0.00000 |
  6. | 14061**** | Fixe vers mobile |              5738 | ET90***    |      3061.11000 |
  7. | 14061**** | Internationale   |                23 | ET90***    |        50.48000 |
  8. | 14061**** | Locale           |              6673 | ET90***    |       576.44000 |
  9. | 14061**** | Nationale        |              8489 | ET90***    |       783.10000 |
  10. | 14065**** | Locale           |                48 | ET90***    |         1.09000 |
  11. +-----------+------------------+-------------------+------------+-----------------+


Message édité par Sebastien le 22-07-2003 à 10:31:47
n°473714
VinKool
Posté le 31-07-2003 à 20:06:46  profilanswer
 

Salut
 
d apres ce que g compris tu veux ressortir les numeros de la table telecom_inv_ligne (1549) avec ou sans info de l ot table .
 
Et la requete t en ramene 1899  :pt1cable:  
Y a comme un pb de produit caretesien ou de doublon ds la table
 :pt1cable:

n°474137
vttman2
Je suis Open ...
Posté le 01-08-2003 à 08:49:18  profilanswer
 

Et ça (no garanty ...)
niveau rapidité ?
 
SELECT  
numero,zone,count(numero),patrimoine,sum(montant)  
FROM telecom_inv_ligne inv    
where inv.numero not in
(select cg.id_inst from telecom_cegetel)
group by numero, zone
 
ou  
 
SELECT  
numero,zone,count(numero),patrimoine,sum(montant)  
FROM telecom_inv_ligne inv    
where not exists
(select 'X' from telecom_cegetel
where cg.id_inst = inv.numero )
group by numero, zone
 
 
 

n°490003
Sebastien
Posté le 18-08-2003 à 10:16:40  profilanswer
 

Ma version de Mysql (j'ai mysql si j'ai pas precise) 4.0.13 ne me permet pas de faire ceci malheureusement.

mood
Publicité
Posté le 18-08-2003 à 10:16:40  profilanswer
 

n°490015
Sebastien
Posté le 18-08-2003 à 10:24:53  profilanswer
 

VinKool a écrit :

Salut
 
d apres ce que g compris tu veux ressortir les numeros de la table telecom_inv_ligne (1549) avec ou sans info de l ot table .
 
Et la requete t en ramene 1899  :pt1cable:  
Y a comme un pb de produit caretesien ou de doublon ds la table
 :pt1cable:  


 
Non pas tout a fait car je fais un regroupement par zone chez cegetel.
 
Par exemple le numero de tel
0800240250 n'apparait qu'une fois dans telecom_inv_ligne.
Mais s'il a passe des appels locales et nationales ma requete le retournera deux fois.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Grosse lenteur de left join

 

Sujets relatifs
[Mysql + MyODBC]Problème de lenteur !!plusieur outer join, c'est possible????
Left join est ce la bonne solution?[MySQL] Comment faire un backup d'une grosse BDD ?
Lenteur de la fonction CopyFile() !!!Faire ingurgiter une grosse quantitée a Mysql en Insert ou Update.
Grosse différence de performance entre un CGI en C et C++Grosse variable de session, est-ce bien
[Access] Une grosse question car je suis perdu... 
Plus de sujets relatifs à : Grosse lenteur de left join


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR