Eu tenho uma tabela do PostgreSQL, com quase 2 milhões de linhas, com um coordinates
campo de latência longa no formulário POINT(-73.4938 33.2405)
.
Supondo que exista um índice geoespacial nesse campo, qual é a maneira mais eficiente e rápida de selecionar todas as linhas dentro de uma caixa delimitadora arbitrária?
A caixa é como SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
postgis
performance
geography-data-type
Avishai
fonte
fonte
Respostas:
Supondo que os limites das caixas delimitadoras estejam no mesmo sistema de referência espacial que as coordenadas armazenadas, e você sabe qual operador espacial (interseção ou contido por) é necessário:
Como alternativa, se você preferir o som de "contém" (em vez de "contido por"), a
WHERE
cláusula deve ser invertida:PS: Dado (pelo OP após o post acima) que os registros são pontos simples, acho que a diferença entre "interseções" e "contenção" se torna muito sutil, afetando apenas os pontos nas bordas da caixa delimitadora.
fonte
What's the fastest ...?
: OP&&
e@
não parece funcionar ao cruzar com a geometria do polígono. Nesse caso, useST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
ou alternativamente #ST_Contains
fonte
Aparentemente, não tenho pontos suficientes para adicionar um comentário, por isso estou usando esta resposta apenas para dizer que tentei ST_MakeEnvelope vs a comparação matemática de "x> min_x e x <max_x e y> min_y e y <max_y". ..em média, o ST_MakeEnvelope levou 60ms e a comparação matemática levou 155ms na minha consulta bbox específica.
Portanto, a pesquisa espacial ST_MakeEnvelope deve ser mais rápida que a matemática!
fonte
INDEX
em ST_MakeEnvelope quanto em (ST_XMax, ST_XMin, ST_YMax, ST_YMin) e a diferença é enorme em favor da matemática. Math me levou menos de 20s (INDEX + query), enquanto intersecção Envelope assumiu 2min (eu desisti quando atingiu 2min 40s única para indexação espacial)