Re: Funciones en C mejorar performance

From: "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>
To: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
Cc: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Funciones en C mejorar performance
Date: 2013-05-16 23:20:54
Message-ID: CA+KjtGdzgxS6cW1hwDREt6wLHi2zV3Oqqhdi=8=4Y7MO+oYKsQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Alvaro, Jaime gracias por responder.

respecto a la función ST_aslatlontext ya revise y lamentablemente solo esta
disponible en postgis 2 y yo tengo 1.5 vere de migrar a postgis 2, las
consultas si estan usando los indices espaciales de hecho sin ellos ni
siquiera se podria ejecutar la consulta en mi pc jeje.

con respecto a que el trigger se ejecute en cuando haya modificado la
columna geometria las funciones se llaman con esto no sabia que podia poner
un trigger a ejecutar solo cuando cambia una columna espeifica al menos es
lo que te entendi o no es asi?

CREATE TRIGGER vias_limitrofes
BEFORE UPDATE
ON op_sectores_abastecimiento
FOR EACH ROW
EXECUTE PROCEDURE vias_limitrofes();

las funciones de hecho funcionan bien pero cuando tengo un poligono que
tenga dentro por ejemplo unas 1000 manzanas para localizar sus calles o
ductos de redes de agua empiezan los problemas y he visto aplicaciones en
web que lo hacen muy rapido y queria saber si escribiendo las funciones en
C quizas la performance mejore un poco al tener la función dentro de una
DLL si es asi por favor me podrian ayudar con algun ejemplo de una función
en C que me devuelva los registros de una tabla recibiendo algun parametro
para un where es decir no quisiera que necesariamente me ayuden con estas
funciones pero al menos una pista por donde empezar.

Apelo a su experiencia para saber si esto en C correria mas rapido para
aventurarme a tratar de escribir estas funciones en C que tengo varias como
esta consulta que es de las mas pesadas que estoy utilizando espero puedan
ayudarme gracias

select distinct on (a.gid) c.rotulo,a.gid,a.diametro,a.longitud as st_length
from met_alcantarillado_jvenegas a,met_calle_jvenegas c
where st_intersects(st_buffer(c.st_intersection,15),a.st_intersection)

AND
(
(CASE WHEN
(st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))
< 180
THEN
CASE
WHEN

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) > 180
THEN

ABS((st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) - 180)
ELSE

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516))
END

ELSE

CASE WHEN
(st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))
> 180
THEN
CASE
WHEN

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) < 180
THEN

ABS((st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) + 180)
ELSE

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516))
END

ELSE
(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
)
END
END)
>
((st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))-
10)

and
(CASE WHEN
(st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))
< 180
THEN
CASE
WHEN

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) > 180
THEN

ABS((st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) - 180)
ELSE

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516))
END

ELSE

CASE WHEN
(st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))
> 180
THEN
CASE
WHEN

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) < 180
THEN

ABS((st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
) + 180)
ELSE

(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516))
END

ELSE
(st_azimuth(st_startpoint(a.st_intersection),st_endpoint(a.st_intersection))*(180/3.141516)
)
END
END) <
((st_azimuth(st_startpoint(c.st_intersection),st_endpoint(c.st_intersection))*(180/3.141516))
+ 10)
)

order by a.gid,rotulo

El 16 de mayo de 2013 17:46, Jaime Casanova <jaime(at)2ndquadrant(dot)com>escribió:

> 2013/5/16 Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>:
> >
> > El problema que le veo a esto no es tanto que viole formas normales (lo
> > cual puede ser aceptable porque quizás encontrar latitud y longitud a
> > partir de un dato puede ser caro), sino que el método que está usando
> > seguramente no es de lo mejor. Primero convierte la geometría a texto,
> > luego recorre el texto completo para saber el largo total, luego lo
> > recorre otra vez para contar caracteres. Yo creo que debe ser más
> > inteligente usar ST_AsLatLonText o algo.
> > http://www.postgis.org/docs/ST_AsLatLonText.html
> >
>
> supuse que existiría una función como esa, pero tenía demasiada pereza
> de buscar.
>
> --
> Jaime Casanova www.2ndQuadrant.com
> Professional PostgreSQL: Soporte 24x7 y capacitación
> Phone: +593 4 5107566 Cell: +593 987171157
>

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2013-05-17 13:22:27 Re: Funciones en C mejorar performance
Previous Message Jaime Casanova 2013-05-16 22:46:57 Re: Funciones en C mejorar performance