Conforme descrito, a resposta é "nenhum", pelos seguintes motivos:
- Pegue uma tabela espacial em 4326. Crie um índice espacial nela. O índice espacial é um índice planar, consistindo nos limites 2D dos recursos, em 4326, classificados em uma estrutura em árvore.
- (a) execute uma consulta de filtro de distância usando uma conversão, como
ST_DWithin(geom::geography, %anothergeom, %radius)
. Como a geografia está envolvida, o sistema procurará um índice geográfico (construído em uma esfera, não em um plano) e não o encontrará. Como não possui índice, ele realizará a junção usando varreduras completas das tabelas. Vai ser lento.
- (b) execute uma consulta de filtro de distância usando uma transformação, como
ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)
. Seus testes não são contra a coluna indexada (geom), mas contra uma função aplicada à coluna ( ST_Transform(geom,2163)
) e, novamente, seu índice espacial não será usado. Vai ser lento.
Você precisa que sua consulta e seu índice se harmonizem. Se você não deseja alterar a projeção de seus dados, será necessário usar um índice funcional; por exemplo, se você criar um índice de geografia de função, poderá usar uma consulta baseada em geografia:
CREATE INDEX mytable_geog_x
ON mytable USING GIST (geography(geom));
SELECT *
FROM mytable
WHERE ST_DWithin(geography(geom), %anothergeography, %radius);
Ou, no caso de transformação:
CREATE INDEX mytable_geog_x
ON mytable USING GIST (ST_Transform(geom, 2163));
SELECT *
FROM mytable
WHERE ST_DWithin(ST_Transform(geom, 2163), %another2163geometry, %radius);
O desempenho mais rápido absoluto será se você converter os dados da sua tabela em uma projeção plana (como EPSG: 2163 ), criar um índice espacial e depois usá-lo ST_DWithin()
no resultado.
ALTER TABLE mytable
ALTER COLUMN geom
TYPE Geometry(Point, 2163)
USING ST_Transform(geom, 2163);
CREATE INDEX mytable_geom_x ON mytable USING GIST (geom);
SELECT *
FROM mytable
WHERE ST_DWithin(geom, %some2163geom, %radius)