如何在PostgreSQL的地理数据上改进“GROUP BY”的“MAX”?

我有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));

不使用.

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

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

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

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...