Re: Funciones en C mejorar performance

From: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
To: "jvenegasperu (dot)" <jvenegasperu(at)gmail(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-17 13:22:27
Message-ID: CAJKUy5iU3six5QJmX+5Z9EKtOBO0CnD1KBa+G18+KUovq0+VPg@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>:
> 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.
>

tienes razón, esa consulta esta disponible desde postgis 2.0 pero
encontre una forma de determinar lo mismo en 1.5
fijate si esto resulta más rápido que lo que tienes ahora o no.

http://gis.stackexchange.com/questions/19099/how-to-extract-latitude-longitude-values-for-specific-points-from-a-shapefile

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

asi es. pero no has dicho que versión de postgres tienes, si es 9.1 o
superior tu CREATE TRIGGER quedaría así

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

este trigger no deberías ejecutarlo también en INSERT?

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

las funciones en C son generalmente más rápidas. sin embargo considera
que si el problema es la sentencia SQL, seguirá siendo un problema
también en C, porque el código C tendrá que enviar a ejecutar las
consultas.

En realidad tienes que ejecutar la consulta de abajo así? eso es muy
poco optimizable (si es que puede optimizarse algo). no podrías mejor
calcular los datos del WHERE primero y luego armar la sentencia
dinámicamente?

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

--
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 Rusel Fichi 2013-05-17 17:04:05 Dudas sobre consulta SQL
Previous Message jvenegasperu . 2013-05-16 23:20:54 Re: Funciones en C mejorar performance