RE: Query NOt In para optimizar

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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