如何改善" MAX" for" GROUP BY"关于PostgreSQL的地理数据?

时间:2018-01-08 07:37:04

标签: sql postgresql

我有3列公司的地址表: company_id lat lon

我需要与每家公司保持最近的距离。 我对PostgreSQL使用 cube earthdistance 扩展。

查询工作正常但很慢:

SELECT
 company_id,
 MIN(earth_distance(ll_to_earth(lat,lon), ll_to_earth(53.96,83.96))) AS distance
FROM companies
GROUP BY company_id;

GIST索引如:

CREATE INDEX i_name on companies USING gist(ll_to_earth(lat, lon));

不使用。

我该如何解决这个问题? 感谢。

2 个答案:

答案 0 :(得分:3)

通常,索引可以帮助您从大表中查找少量行,或者提高ORDER BY查询的速度。您的查询需要扫描表中的所有行,并对所有行执行复杂计算。因此,索引无法帮助您,因为Postgres不会将索引用作预先计算的值。

您应该将ll_to_earth(lat, lon)的值预先计算到单独的列中,并在查询中使用此列。

答案 1 :(得分:0)

使用PostGIS索引

你需要一个KNN索引。

CREATE EXTENSION postgis;

ALTER TABLE companies ADD COLUMN geog geography(POINT 4326);
UPDATE companies
  SET geog = ST_MakePoint(lon,lat)::geogprahy;

SELECT DISTINCT ON (company_id)
  company_id,
  ST_Distance(company_id,ST_Point(83.96,53.96)::geography)
FROM companies
ORDER BY company_id, geog <=> ST_Point(83.96,53.96)::geography DESC;