Re: Funciones en C mejorar performance

From: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
To: "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Funciones en C mejorar performance
Date: 2013-05-16 19:29:46
Message-ID: CAJKUy5ihqqBiHyXZf2YZ1+5xmAtDgSjKNF6299jyJR38vdWCZg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2013/5/16 jvenegasperu . <jvenegasperu(at)gmail(dot)com>:
>

antes de que te decidas a escribir esto en C (que deberia ser
posible). te sugiero un par de cosas.

> CREATE OR REPLACE FUNCTION vias_limitrofes_sub_sectores()
> RETURNS trigger AS
> $BODY$
> BEGIN
> IF NEW.the_geom <> old.the_geom THEN

que versión de PostgreSQL es esta? desde la versión 9.1 puedes crear
el trigger diciendole

BEFORE INSERT OR UPDATE OF the_geom

eso hará que el trigger solo se ejecute cuando la columna the_geom sea
modificada, en este momento estas pagando el costo de comparar la
columna the_geom (que debese ser costoso y lento) siempre

> NEW.area_sub_sector = round(st_area(NEW.the_geom)::numeric,2);
> delete from op_vias_limites_sub_sectores_abastecimiento where
> myid = new.myid;
> INSERT INTO op_vias_limites_sub_sectores_abastecimiento
> (myid,gid)
> select s.myid,v.gid from op_sub_sectores_abastecimiento
> s,cat_vias v where s.myid = new.myid and
> st_intersects(buffer(s.the_geom,3),v.the_geom);

no estoy seguro que esta consulta este usando un índice, claro que
tampoco he hecho la prueba... podrías hacer un explain analyze de ese
select tomando un registro al azar como ejemplo?

>
> y esta otra función
>
> CREATE OR REPLACE FUNCTION geographyforgoogle()
> RETURNS trigger AS
> $BODY$
> DECLARE
> BEGIN
> -- NEW.long_xy := round(cast(st_length(NEW.the_geom) as numeric),2);
> NEW.geography := transform(NEW.the_geom_origen,4326);
> NEW.latitud:= substring(st_astext(NEW.geography) from position('-8' in
> st_astext(NEW.geography)) for
> char_length(st_astext(NEW.geography))-position('-8' in
> st_astext(NEW.geography)));
> NEW.longitud:= substring(st_astext(NEW.geography) from 7 for position('-'
> in substring(st_astext(NEW.geography) from 8 for
> char_length(st_astext(NEW.geography))))-1);
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE
> COST 100;
> ALTER FUNCTION geographyforgoogle()
>

supongo que dire lo mismo, si estas en 9.1 o superior esto solo
necesita ser ejecutado si insertas o actualizas
ahora, personalmente veo cuestionable que tengas tantos "datos
calculados" (datos que obviamente dependen de otra columna, violan una
de las formas normales. aunque no recuerdo cual).

>
> y esta que es para listar los permisos de un usuarios
>
> CREATE OR REPLACE FUNCTION sp_listarpermiso(integer, integer, integer)
> RETURNS SETOF record AS
> $BODY$
> DECLARE
> r RECORD;
> BEGIN
> FOR r IN
> select permiso_id, t.tarea_id, tar_nombre, tar_descripcion,
> gru_descripcion, pso_activo
> from tarea t inner join grupo g on t.grupo_id = g.grupo_id inner
> join permiso p on t.tarea_id = p.tarea_id
> where p.rol_id = $3 order by t.tarea_id LIMIT $1 offset $2
>
>
> LOOP
> RETURN NEXT r;
> END LOOP;
> RETURN;
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE
>

esta la puedes reescribir asi:

CREATE OR REPLACE FUNCTION sp_listarpermiso(integer, integer, integer)
RETURNS SETOF record AS
$BODY$
select permiso_id, t.tarea_id, tar_nombre, tar_descripcion,
gru_descripcion, pso_activo
from tarea t inner join grupo g on t.grupo_id = g.grupo_id inner
join permiso p on t.tarea_id = p.tarea_id
where p.rol_id = $3 order by t.tarea_id LIMIT $1 offset $2
$BODY$
LANGUAGE sql STABLE;

debería ser más rápida, igual verifica que este usando índices

--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación
Phone: +593 4 5107566 Cell: +593 987171157

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2013-05-16 20:32:12 Re: Funciones en C mejorar performance
Previous Message Yoan Manuel Perez Piñero 2013-05-16 15:43:24 Re: Uso de UNION con ORDER BY