Re: Cómo cambio el plan de ejecución de un query

From: "Jaime Casanova" <jcasanov(at)systemguards(dot)com(dot)ec>
To: Carlos Beltrán V(dot) <cbeltran(at)roldan(dot)net>
Cc: ListaPostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Cómo cambio el plan de ejecución de un query
Date: 2008-08-29 03:55:46
Message-ID: 3073cc9b0808282055p60696acdj617eb89e41c72de7@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2008/8/28 "Carlos Beltrán V." <cbeltran(at)roldan(dot)net>:
> " Hash Cond: (di.documentos_id = dd.documentos_id)"
> " -> Seq Scan on declaraciones_importacion di (cost=0.00..18761.24 rows=20725 width=16)

(actual time=1070.900..1274549.934 rows=3305
loops=1)"
> " Filter: es_declaracion_modalidad_temporal(declaraciones_importacion_id)"

como dices esta filtrando esto primero. pero fijate ademas en el
estimado de filas a retornar... solo por casualidad has ejecutado
ANALYZE recientemente?

de todos modos, es evidente que esta creyendo que la funcion es "barata".
no mostraste el nivel de volatilidad con que estas marcando la
funcion: IMMUTABLE, STABLE o VOLATILE?

>
> La función es
>
> create or replace function es_declaracion_modalidad_temporal(bigint) returns
> boolean as '
> DECLARE
> esta_declaracion_id ALIAS FOR $1;
> es_temporal boolean;
> esta_modalidad_id integer;
> BEGIN
> SELECT modalidades_id into esta_modalidad_id FROM items_declaracion_imp
> WHERE declaraciones_importacion_id = esta_declaracion_id;
> SELECT es_modalidad_temporal(esta_modalidad_id) INTO es_temporal;
> return es_temporal;
> END;
>

esta funcion debes estarla marcando como STABLE, ademas no creo que
necesites una funcion plpgsql. podrias escribirlas asi:

create or replace function es_declaracion_modalidad_temporal(bigint)
returns boolean as '
SELECT es_modalidad_temporal(modalidades_id)
FROM (SELECT modalidades_id FROM items_declaracion_imp
WHERE declaraciones_importacion_id = $1) as foo;
' language sql stable;

create or replace function es_modalidad_temporal(int) returns boolean as '
SELECT $1 IN (180000209, 180000198, 180000204, 180000210, 180000200,
180000206,
180000212, 180000199, 180000205, 180000211,
180000196, 180000197,
180100013, 180000203);
' language sql immutable;

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. (593) 87171157

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2008-08-29 04:10:54 Re: Cómo cambio el plan de ejecución de un query
Previous Message Alvaro Herrera 2008-08-29 02:39:20 Re: Left join anidados