我有两张桌子,比如A和B,其中包含两列的城市信息:纬度和经度。 A包含100,000条记录,B包含1,000,000条记录。我的目标是找到距离A 1公里范围内的B行(对于A中的每一行)。我该如何有效地做到这一点?我的目标是不到30分钟。
以下查询需要永远(我认为这是100,000 * 1,000,000 = 1000亿行比较的交叉产品的结果!):
select *
from A
inner join B
on is_nearby(A.latitude, A.longitude, B.latitude, B.longitude)
is_nearby()
只是一个简单的函数,可以找出纬度和经度之间的差异。
我对A行进行了一次测试,每行大约需要5秒。根据我的计算,查询完成执行需要几周的时间,这是不可接受的。
答案 0 :(得分:2)
是的,PostGIS会让事情变得更快,因为它(a)知道如何将纬度和经度转换为公里(我将使用下面的geography type),并且(b)支持{{3这是GIS的最佳选择。
假设您的系统上有可用的PostGIS版本2,请升级您的数据库和表格:
CREATE EXTENSION postgis;
-- Add a geog column to each of your tables, starting with table A
ALTER TABLE A ADD COLUMN geog geography(Point,4326);
UPDATE A SET geog = ST_MakePoint(longitude, latitude);
CREATE INDEX ON A USING GIST (geog);
--- ... repeat for B, C, etc.
现在找到距离A 1公里范围内的B行(对于A中的每一行):
SELECT A.*, B.*, ST_Distance(A.geog, B.geog)/1000 AS dist_km
FROM A
JOIN B ON ST_DWithin(A.geog, B.geog, 1000);