No puedo usar esa forma porque hago otro filtro por la tabla principal y se convierte entonces en un INNER
Date: Tue, 16 Dec 2014 08:43:55 -0500 Subject: Re: [pgsql-es-ayuda] Query NOt In para optimizar From: hiv...@gmail.com To: mar...@2ndquadrant.com CC: pgsql-es-ayuda@postgresql.org; listas_quij...@hotmail.com Ahh ok no había probando nunca con un IS NULL, gracias por la corrección!!! El 16/12/2014 08:20, "Martín Marqués" <mar...@2ndquadrant.com> escribió: El 16/12/14 a las 10:07, Hellmuth Vargas escribió: > Hola lista > > Martín disculpe la ignorancia, pero tengo entendido que si se coloca una > condición filtró en el where de la tabla B, el left outer se convierte en > inner join y se pierde el efecto. Por favor corrijame si me equivoco Te corrijo! ;) Prueba con un EXPLAIN ANALYZE para ver como PostgreSQL planifica la consulta. explain analyze select * from personas where codigo NOT IN (SELECT persona FROM usuarios); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ Seq Scan on personas (cost=3084.72..6036.51 rows=62552 width=46) (actual time=111.600..162.448 rows=15 loops=1) Filter: (NOT (hashed SubPlan 1)) Rows Removed by Filter: 125088 SubPlan 1 -> Seq Scan on usuarios (cost=0.00..2714.98 rows=147898 width=4) (actual time=0.011..31.877 rows=147898 loops=1) Total runtime: 162.520 ms explain analyze select * from personas p LEFT OUTER JOIN usuarios u ON (p.codigo=u.persona) where u.persona IS NULL; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------- Hash Anti Join (cost=5719.70..18174.42 rows=13388 width=83) (actual time=74.550..195.594 rows=15 loops=1) Hash Cond: (p.codigo = u.persona) -> Seq Scan on personas p (cost=0.00..2639.03 rows=125103 width=46) (actual time=0.004..19.270 rows=125103 loops=1) -> Hash (cost=2714.98..2714.98 rows=147898 width=37) (actual time=70.090..70.090 rows=147898 loops=1) Buckets: 16384 Batches: 2 Memory Usage: 4749kB -> Seq Scan on usuarios u (cost=0.00..2714.98 rows=147898 width=37) (actual time=0.003..23.560 rows=147898 loops=1) Total runtime: 195.660 ms En este caso, anduvo más rápido con el NOT IN (), pero eso depende mucho de cuantos datos se esten filtrando, cuantos datos totales haya en cada tabla, etc. 200k no es una gran tabla, IMO. Saludos, -- Martín Marqués http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services