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
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 |