在十进制(经度/纬度)列上连接两个表是*慢*

时间:2014-04-24 19:32:41

标签: sql ms-access ms-access-2010

我有两个表,每个表都有字段标签,纬度,经度。我想拉出纬度和经度匹配的两个标签。这将创建新表Label1,Label2,Latitude,Longitude。

SELECT Label1, Label2, Round(Latitude2,5) AS Expr1, Round(Longitude2,5) AS Expr2,Round(Latitude1,5) AS Expr3, Round(Longitude1,5) AS Expr4 INTO Merge
FROM [Table1], [Table2]
WHERE (((Round(Latitude2,5))=Round(Latitude1,5)) AND ((Round(Longitude2,5))=Round(Longitude1,5)));

这似乎让我陷入了一个循环,我很确定我理解为什么,但不能完全弄清楚如何得到我想要的东西。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

正如其中一条评论中提到的那样,在连接条件中使用Round()函数这一事实意味着数据库引擎无法在经度和纬度字段上使用任何索引(如果这样的索引甚至存在)。这很可能是您遇到的业绩不佳的原因。

我有一个包含两个表的测试用例,每个表有5,000行。 [表1]的结构是

ID - 自动编号,主键
经度1 - 双重
Latitude1 - 双重
Label1 - 文本

[Table2]的结构是相同的,除了这些字段被命名为[Longitude2],[Latitude2]和[Label2]。

当我运行您在问题中发布的查询时,需要10分钟才能完成。

为了加快速度,我在每个表中添加了两个字段:[intLon]和[intLat],它们都被定义为Long Integer并被索引。他们的人口如下:

UPDATE Table1 SET
    intLon = Round(Longitude1, 5) * 100000,
    intLat = Round(Latitude1, 5) * 100000

UPDATE Table2 SET
    intLon = Round(Longitude2, 5) * 100000,
    intLat = Round(Latitude2, 5) * 100000

完成后,我们可以使用

获得与初始查询相同的结果
SELECT Label1, Label2, Round(Latitude2,5) AS Expr1, Round(Longitude2,5) AS Expr2,Round(Latitude1,5) AS Expr3, Round(Longitude1,5) AS Expr4 INTO Merge
FROM 
    [Table1] 
    INNER JOIN 
    [Table2] 
        ON Table1.intLon = Table2.intLon 
            AND Table1.intLat = Table2.intLat

但不是花10分钟执行,而是需要0.8 才能运行。