Grosse lenteur de left join

Grosse lenteur de left join - SQL/NoSQL - Programmation

Marsh Posté le 21-07-2003 à 14:07:32    

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 |                 |

Reply

Marsh Posté le 21-07-2003 à 14:07:32   

Reply

Marsh Posté le 21-07-2003 à 14:09:51    

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

Reply

Marsh Posté le 21-07-2003 à 16:11:33    

Me revoila :-|

Reply

Marsh Posté le 21-07-2003 à 17:00:23    

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 ?

Reply

Marsh Posté le 21-07-2003 à 17:01:18    

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

Reply

Marsh Posté le 22-07-2003 à 10:17:30    

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

Reply

Marsh Posté le 22-07-2003 à 10:29:18    

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
Reply

Marsh Posté le 31-07-2003 à 20:06:46    

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:

Reply

Marsh Posté le 01-08-2003 à 08:49:18    

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
 
 
 

Reply

Marsh Posté le 18-08-2003 à 10:16:40    

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

Reply

Marsh Posté le 18-08-2003 à 10:16:40   

Reply

Marsh Posté le 18-08-2003 à 10:24:53    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed