From: | Edwin Quijada <listas_quijada(at)hotmail(dot)com> |
---|---|
To: | Hellmuth Vargas <hivs77(at)gmail(dot)com>, Martín Marqués <martin(at)2ndquadrant(dot)com> |
Cc: | "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Query NOt In para optimizar |
Date: | 2014-12-16 15:05:29 |
Message-ID: | BAY168-W16BDEF60E9321D4FE69C98E36C0@phx.gbl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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: hivs77(at)gmail(dot)com
To: martin(at)2ndquadrant(dot)com
CC: pgsql-es-ayuda(at)postgresql(dot)org; listas_quijada(at)hotmail(dot)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" <martin(at)2ndquadrant(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Martín Marqués | 2014-12-16 15:11:42 | Re: Query NOt In para optimizar |
Previous Message | Alvaro Herrera | 2014-12-16 15:03:28 | Re: AYUDA |