4

我有一个包含 300'000 个单位的表格,其中每个单位的位置由一个坐标定义(X,Y)。我想知道哪些单位与每个单位都在一定距离内?

前任。

UnitiID   X   Y
A         10  15
B         10  25
C         25  15


proc sql;
    create table work.Test2 as
    select distinct
    a.UnitID,
    a.X,
    a.Y,
    b.UnitID as CloseUnit label="CloseUnit",
    sqrt( (a.X-b.X)**2 + (a.Y-b.Y)**2 ) as distance
    from
    work.Test as a
    left join
    work.Test as b
    on
    0<sqrt( (a.X-b.X)**2 + (a.Y-b.Y)**2 ) <=15
    ;
quit;

结果:

UnitiID   X   Y   CloseUnit  Distance
A         10  15  B          10
A         10  15  C          15
B         10  25  A          10
C         25  15  A          15

这需要整个表的大量 cpu 时间,因为我们将进行 300'000^2 比较,我该如何执行此任务?

4

1 回答 1

3

我想到了几个优化。首先,您可以检查沿 X 和 Y 轴的距离。如果其中一个大于 15,则这些点不能在范围内。子查询将指示数据库首先进行更快的检查:

select  *
from    (
        select  a.X as aX
        ,       b.X as bX
        ,       a.Y as aY
        ,       b.Y as bY
        from    Test a
        join    Test b
        on      abs(a.X - b.X) <= 15
                and abs(a.Y - b.Y) <= 15
        ) as SubQueryAlias
where   sqrt( (aX-bX)**2 + (aY-bY)**2 ) <= 15

第二个优化是将sqrt计算向右移动:

where   (aX-bX)**2 + (aY-bY)**2 <= 15**2

平方比生根快,尤其是在常数上进行时。

如需进一步优化,请查看关于 Geohashing 的 Wikipedia 文章

于 2012-08-01T14:14:41.633 回答