2009-11-20 7 views
3

J'ai plusieurs déclarations qui ont accès très grandes tables avec Postgresql à savoir:Postgresql: alternative à OÙ PAS OÙ respective

SELECT a.id FROM a WHERE a.id IN (SELECT b.id FROM b); 
SELECT a.id FROM a WHERE a.id NOT IN (SELECT b.id FROM b); 

Certains d'entre eux, même accéder à des tables encore plus de cette façon. Quelle est la meilleure approche pour augmenter la performance, est-ce que je devrais passer aux jointures?

Merci beaucoup!

Répondre

7

REJOIGNEZ sera beaucoup plus efficace, ou vous pouvez utiliser EXISTE:

SELECT a.id FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id) 

Le sous-requête retourne au plus 1 rang.

0

Oui, je recommanderais d'aller aux jointures. Cela accélérera les instructions select.

3

est ici un moyen de filtrer les lignes avec une INNER JOIN:

SELECT  a.id 
FROM  a 
INNER JOIN b ON a.id = b.id 

Notez que chaque version peut fonctionner différemment; parfois IN est plus rapide, parfois EXISTS, et parfois INNER JOIN.