Trilhos – desempenho pós-vizinho mais próximo

Recentemente, tive que implementar uma busca de vizinho mais próximo em rails com postgres postgis.

Estou executando em:
– osx maverciks
– rails 4.03
– postgres 9.3.3

Criei o seguinte escopo em uma grande tabela de dados (400k entradas). A coluna lonlat tem um índice.

scope :closest, ->(point) { 
where("ST_Distance(lonlat, ST_WKTToSQL('#{point.as_text}')) < 5000 ")
.order("ST_Distance(lonlat, ST_GeomFromText('#{point.as_text}', #{SRID}))").limit(5) }

Carga (748,7ms)

comparado com

scope :closest, ->(point) 
where("lonlat && ST_Expand(ST_WKTToSQL('#{point.as_text}'), 5000)")
.order("ST_Distance(lonlat, ST_GeomFromText('#{point.as_text}', #{SRID}))").limit(5) }

Carga (1327,8ms)

então, a fim de acelerar sua consulta, parece que st_distance é muito mais rápido em comparação com a outra condição onde