OVH Cloud OVH Cloud

Optimisation de "IN (SELECT ...)"

3 réponses
Avatar
pierref
Bonjour,

Voici une de mes requetes :
SELECT Client.Groupe, ...
FROM Client
WHERE ((Client.Groupe) In (SELECT Groupe FROM Criteres_groupes));

Le IN (SELECT..) marche bien qd il y a peu de données mais est très lent
lorsqu'il y a bcp de données. C'est le cas de la requete ci-dessus.

Y aurait il une alernative au IN (SELECT..) pour que l'execution de la
requete soit plus rapide (pour un resultat identique).

Par avance merci

Pierre

3 réponses

Avatar
Rv
Salut,


On peut essayer de remplacer la clause WHERE par une jointure du style:

SELECT Client.Groupe, ...
FROM Client
INNER JOIN Criteres_Groupes ON Client.Groupe = Criteres_Groupes.Groupe
si Criteres_Groupes ne contient pas plusieurs enregistrements avec le même
Groupe

ou

SELECT DISTINCT Client.Groupe, ...
FROM Client
INNER JOIN Criteres_Groupes ON Client.Groupe = Criteres_Groupes.Groupe
si Criteres_Groupes contient plusieurs enregistrements avec le même Groupe.
Eventuellement un regroupement...

voire

SELECT Client.Groupe, ...
FROM Client
INNER JOIN
(SELECT DISTINCT Criteres_Groupes.Groupe FROM Criteres_Groupes) as sr ON
Client.Groupe = sr.Groupe

Enfin, c'est une idée mais il manque quelques infos. Je ne garantie rien
mais dites si cela marche.

A+

Rv



"pierref" a écrit dans le message de
news:
Bonjour,

Voici une de mes requetes :
SELECT Client.Groupe, ...
FROM Client
WHERE ((Client.Groupe) In (SELECT Groupe FROM Criteres_groupes));

Le IN (SELECT..) marche bien qd il y a peu de données mais est très lent
lorsqu'il y a bcp de données. C'est le cas de la requete ci-dessus.

Y aurait il une alernative au IN (SELECT..) pour que l'execution de la
requete soit plus rapide (pour un resultat identique).

Par avance merci

Pierre




Avatar
Eric
Bonjour,

Je suppose d'après ton sql que certains clients ont des valeurs pour le
champ groupe qui ne sont pas dans la table/requête Criteres_groupes.

En faisant simplement une jointure entre les tables Client et
Criteres_groupes
SELECT Client.groupe, ...
FROM Client Inner Join Criteres_groupes
ON Client.groupe=Criteres_groupes.Groupe

(ou encore un produit cartésien avec une condition de jinture mais bon,
c'est rétro)
SELECT Client.groupe, ...
FROM Client, Criteres_groupes
WHERE Client.groupe=Criteres_groupes.Groupe

J'ai bon ?

Bonjour,

Voici une de mes requetes :
SELECT Client.Groupe, ...
FROM Client
WHERE ((Client.Groupe) In (SELECT Groupe FROM Criteres_groupes));

Le IN (SELECT..) marche bien qd il y a peu de données mais est très lent
lorsqu'il y a bcp de données. C'est le cas de la requete ci-dessus.

Y aurait il une alernative au IN (SELECT..) pour que l'execution de la
requete soit plus rapide (pour un resultat identique).

Par avance merci

Pierre




--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
pierref
Merci à tous les deux.

J'ai finalement fait un "group by" Groupe dans la table criteres_groupes.

Puis dans ma requete j'utilise :
where Client.Groupe = Criteres_Groupes.Groupe

Le résultat à l'air tout a fait correct. (je vais qd meme verifier ca en
detail)
Et ca va surtout bcp plus vite que le IN (SELECT ..).

A bientot

Pierre


Bonjour,

Voici une de mes requetes :
SELECT Client.Groupe, ...
FROM Client
WHERE ((Client.Groupe) In (SELECT Groupe FROM Criteres_groupes));

Le IN (SELECT..) marche bien qd il y a peu de données mais est très lent
lorsqu'il y a bcp de données. C'est le cas de la requete ci-dessus.

Y aurait il une alernative au IN (SELECT..) pour que l'execution de la
requete soit plus rapide (pour un resultat identique).

Par avance merci

Pierre