Mi conjetura es que ST_MakePoint
es más rápido, pero esto es bastante fácil de referencia con 100k puntos al azar.
\timing
WITH test AS (
SELECT <POINT CONSTRUCTOR METHOD>
FROM generate_series(1,100000)
)
SELECT count(*) FROM test;
Y aquí están algunos de los resultados con PostGIS 2.1 (tronco) en PostgreSQL 9.1, x64 Debian. Hice un par de veces para obtener un promedio aproximado. Aquí están las <POINT CONSTRUCTOR METHOD>
en orden de la más rápida a la más lenta:
-
ST_SetSRID(ST_MakePoint(random(), random()), 4326)
- avg 160 ms
- por lejos, más rápido, y conserva la doble precisión de punto (lossless)
- forma más fácil de hacer una consulta con parámetros numéricos los datos de las coordenadas
-
ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
- avg 760 ms
- lento, como el número se convierte a texto, a continuación, la cadena se reunía, a continuación, PostGIS necesita analizar para encontrar los números
- con pérdidas, debido al número -> texto -> número de conversiones
-
ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
- avg 810 ms
- más lento, no sé por qué es más lento de lo
ST_GeomFromText
Por último, una wee nota de pie de página en la diferencia entre lossless/con pérdida de las conversiones con los métodos anteriores. Sólo ST_MakePoint
conserva el binaria de punto flotante de precisión de los datos, y el texto de las conversiones truncar una parte muy pequeña de los datos. Aunque los dos puntos pueden tener diferencias binarias (visto en la WKB), que siempre debe ser espacialmente igual. La distancia diferencias son esencialmente el epsilon de la máquina de doble precisión.
SELECT
(geom_text = geom_binary) AS spatially_equal,
(geom_text::text = geom_binary::text) AS binary_equal,
(ST_AsText(geom_text) = ST_AsText(geom_binary)) AS wkt_equal,
ST_Distance(geom_text, geom_binary)
FROM (
SELECT x, y,
ST_GeomFromText('POINT(' || x::text || ' ' || y::text || ')') AS geom_text,
ST_MakePoint(x, y) AS geom_binary
FROM (SELECT random()::float8 as x, random()::float8 as y) AS f1
) AS f2;
spatially_equal | binary_equal | wkt_equal | st_distance
-----------------+--------------+-----------+----------------------
t | f | t | 1.38777878078145e-16