OVH Cloud OVH Cloud

[MySQL] sous requete ?

11 réponses
Avatar
Jérémy Cluzel
Bonjour,

J'ai un pb avec la requete suivante:

SELECT CONCAT( etb_id, '-', ofr_id ) AS code, COUNT( DISTINCT CONCAT(
etb_id, '-', ofr_id ) ) AS count
FROM radacct, card
WHERE card.card_username = radacct.UserName
GROUP BY UserName
HAVING MIN( AcctStartTime ) LIKE '2007-01-10%'

elle me retourne les resultats suivants:

code count
30-2 1
7-1 1
13-1 1
20-2 1
20-6 1
20-6 1
13-3 1
13-3 1
11-3 1
29-5 1
13-5 1

mais, moi, ce que je voudrais, ca serait plutot un truc comme ca:

code count
30-2 1
7-1 1
13-1 1
20-2 1
20-6 2
13-3 2
11-3 1
29-5 1
13-5 1

j'ai oublié un truc ? ou il faut que je passe par une sous requete ?

Jeremy

1 réponse

1 2
Avatar
helios
Pif a écrit :
sur MySQL 4.1, j'ai déjà observé qu'il y avait une explosion de mémoire
(et temps) pour une jointure alors que la taille du résultat ne le
justifiais pas...

Du coup, j'ai procédé moi même au découpement de la requête en Java
(JDBC), ce qui avait donné lieu à de vives critiques lors d'un fil
précédent.

Je ne dis pas qu'un autre SGBDR aurait fait la même chose, mais je dis
qu'une jointure ca coute cher...

A priori, ca coute au moins
- R x log(S) ou S est la table référencée (CIR ou s'il y a un index
sur le bon attribut de S),
- ou R x S s'il n'y en a pas...

(en supposant R et S deux cardinalités des deux tables mise en jeux).

Sinon, je demande à ce qu'on m'explique l'algo miraculeux ?



oui une jointure est très coûteuse en temps tu viens de découvrir une
des raisons des performances des SGBDR MV moins de jointures

par exemple voici un test sur un duron700 (une machine la plus faible
que j'ai trouvé avec HD déplorable 128mo ram .....) de openqm

GLOBAL FILE STATISTICS 11:55:17

....System .....Total .......... ...Average
.....Total ..this run ...Per sec ...per sec
Period 00:02:37 00:02:28
Opens 92 86 0 0.6
Reads 535310 535289 0 3616.8
Writes 2 1 0 0.0
Deletes 4 2 0 0.0
Clears 0 0 0 0.0
Selects 1 1 0 0.0
Splits 0 0 0 0.0
Merges 0 0 0 0.0
AK Reads 0 0 0 0.0
AK Writes 0 0 0 0.0
AK Deletes 0 0 0 0.0

Press any key to quit

la requête lancé pour le test contient la gestion de 90 items et
l'équivalent de 58 jointures en SQL le tout sur 5 fichiers multivalué
(en SQL il aurait fallu 63 tables)
1 2