Re: Ayuda con rendimiento..

From: Mario <gonzalemario(at)gmail(dot)com>
To: "Leonardo Castillo" <leonardo(at)hacer(dot)ula(dot)ve>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ayuda con rendimiento..
Date: 2007-02-23 20:38:27
Message-ID: 2065a6cf0702231238h41ff660fj1203b29ea436385c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 23/02/07, Leonardo Castillo <leonardo(at)hacer(dot)ula(dot)ve> wrote:
> Mario, que me recomiendas para evitarme los seq scan?. Lo de Validado no lo
> puedo hacer como me comentas pq mi aplicación es una plataforma de manejo
> de información, y en ese caso validado no se maneja como normalmente uno
> esperaría TRUE o FALSE.
>

Algunas veces cuando haces outer join (o algun join) es un poco
dificil poder sacarlos. Muchas veces se puede solucionar agregando un
indice en la columna que se usa como filtro.

Ahora lo que puedes probar de forma es cambiar esa busqueda de la
palabra por un numero. Un ejemplo rapido:

test=> CREATE TABLE estado(id_estado serial primary key, texto text);
test=> CREATE TABLE datos(contenido text, id_estado integer references estado);

test=> INSERT INTO estado (texto) VALUES ('Validado');
test=> INSERT INTO estado (texto) VALUES ('No Validado');
test=> INSERT INTO estado (texto) VALUES ('Desconocido');
test=> INSERT INTO estado (texto) VALUES ('y blah y blah');

test=> INSERT INTO datos ('111111',
(select id_estado from estado where texto = 'Validado'));
test=> INSERT INTO datos ('222222',
(select id_estado from estado where texto = 'Validado'));
test=> INSERT INTO datos ('333333',
(select id_estado from estado where texto = 'Validado'));
test=> INSERT INTO datos ('444444',
(select id_estado from estado where texto = 'Validado'));
test=> INSERT INTO datos VALUES('555555',
(select id_estado from estado where texto = 'No Validado'));
>

--Vemos los datos ingresados
test=> SELECT * from datos ;
contenido | id_estado
-----------+-----------
111111 | 1
2222222 | 1
3333333 | 1
4444444 | 2
555555 | 2
(5 filas)

test=> SELECT * from estado;
id_estado | texto
-----------+---------------
1 | Validado
2 | No Validado
3 | Desconocido
4 | y blah y blah
(4 filas)

--y empezamos a probar
--Esto es algo como tienes tu consulta

1) test=> EXPLAIN ANALYZE
SELECT * from datos where id_estado =
(select id_estado from estado where texto
='Validado' LIMIT 1);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Seq Scan on datos (cost=1.05..2.11 rows=1 width=36) (actual
time=0.022..0.028 rows=3 loops=1)
Filter: (id_estado = $0)
InitPlan
-> Limit (cost=0.00..1.05 rows=1 width=4) (actual
time=0.008..0.009 rows=1 loops=1)
-> Seq Scan on estado (cost=0.00..1.05 rows=1 width=4)
(actual time=0.005..0.005 rows=1 loops=1)
Filter: (texto = 'Validado'::text)
Total runtime: 0.072 ms
(7 filas)

2)

test=> EXPLAIN ANALYZE SELECT contenido from datos where id_estado = 1;
QUERY PLAN
------------------------------------------------------------------------------------------------
Seq Scan on datos (cost=0.00..1.06 rows=1 width=32) (actual
time=0.011..0.016 rows=3 loops=1)
Filter: (id_estado = 1)
Total runtime: 0.043 ms
(3 filas)

Saludos!

--
http://www.advogato.org/person/mgonzalez/

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jonathan ....nem4 2007-02-23 21:16:29 Postgres+postgis
Previous Message fabian olmos 2007-02-23 20:08:13 Re: CALCULO DE HORAS AL DIA