Funciones en C mejorar performance

From: "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>
To: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Funciones en C mejorar performance
Date: 2013-05-16 05:51:43
Message-ID: CA+KjtGdr-rfDtDfd9GMr9jaJEUj6LUYX1+Ec9b+-xpjUqbECPw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buen dia a todos trabajo con bases de datos postgis y tengo algunas
consultas respecto de las funciones que les pondre a continuación de esta
explicación:

de las 3 funciones que coloco aquí las preguntas serian:

pueden estas 3 funciones escribirse en lenguaje C?
si la respuesta es si me podrian dar un ejemplo de como transformar esto a
lenguaje C?
Que necesitaria para compilar esto en windows?
ya que lo unico que he logrado compilar en windows para postgres hasta
ahora es el clasico ejemplo de esto.

#include <postgres.h>
#include <fmgr.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(add_one);

Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}

Podrian explicarme porque alguna de ellas no seria posible que funcionen en
C?
La razon de escribir estas funciones en C es que quiero mejorar la
performance de mi sistema y quisiera saber si al estar escritas en C estas
se podrian ejecutar mas rapido.
Ya que tengo funciones mas complejas a estas en el sentido que hacen mas
deletes inserts y update basicamente en 2 o 3 tablas pero son operaciones
que implican por ejemplo eliminar 50000 lineas de vias y volver a cargar
unas 60000 nuevas que corresponden a un nuevo sector grafico que es un
poligono por ejemplo de una urbanización y encuentro todas las calles que
hay dentro de esta urbanización y cosas asi

Espero sus comentarios y gracias por su tiempo las funciones son estas:

CREATE OR REPLACE FUNCTION vias_limitrofes_sub_sectores()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.the_geom <> old.the_geom THEN
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);
END IF;

RETURN NEW;
END;

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION vias_limitrofes_sub_sectores()

basicamente lo que hace es cuando cambia la geometria de un sector elimina
las lineas de calles y vuelve a obtenerles en funcion de la nueva geometria

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

esta obtiene las coordenadas en el formato que necesito para localizar un
punto en googlemaps

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

--
José Mercedes Venegas Acevedo
cel: Mov. 949808846

mails: jvenegasperu(at)php(dot)net
jvenegasperu(at)gmail(dot)com

PHP Spanish Docs translator member.
http://www.php.net/manual/es/index.php

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Yoan Manuel Perez Piñero 2013-05-16 13:49:38 Uso de UNION con ORDER BY
Previous Message Alvaro Herrera 2013-05-15 19:12:30 Re: 9.3 tablas foráneas y tipo serial