1

我有两张桌子,一张大致如下:

client_ip  server_ip  speed
---------  ---------  -----
1.2.3.4    9.1.2.3    100
1.2.3.5    9.1.2.3    1033

还有一个有地理数据的:

ip       latitude    longitude
-------  --------    ---------
1.2.3.4  13.75       100.21
1.2.3.5  21.1234     141.21
9.1.2.3  13.75       99.21

我想编写一个选择查询,找出两个 IP 地址之间的大圆距离,按它分组,并计算平均速度。因此,例如,理想的输出将类似于:

distance  avg(speed)
--------  ----------
21        99
100       1234

虽然我知道在 SQL 中获得大圆距离方面有很好的资源,但我对如何有效地连接这两个表有点模糊,因为两者都相当大(数百万行)。

有什么建议吗?

4

2 回答 2

1

假设地理数据表中的 IP 是唯一的,实际上它并不是一个非常昂贵的连接。即使您从 server_ip 列中具有非唯一值的表加入,您也不必告诉系统它是外连接——对于“速度”表中的每一行,都会有一个,并且只有一个,IP表中匹配client_ip的条目,并且只有一个IP表中匹配server_ip的条目。因此,您可以毫无问题地使用内部连接。

SELECT <c.client_ip to s.server_ip distance calc> AS Distance, AVG(sp.speed) AS AvgSpeed
FROM speedTable sp JOIN geoTable c
    ON sp.client_ip = c.client_ip JOIN geoTable s
    ON sp.server_ip = s.server_ip
WHERE 1 = 1 --whatever your where clause is
GROUP BY <c.client_ip to s.server_ip distance calc>
于 2013-01-23T22:13:56.557 回答
1

好吧,连接可能不是这个查询的慢部分,它将是每一行的距离计算......

SELECT
  client_ip,
  server_ip,
  avg(speed),
  {your distance calculation} AS distance
FROM 
  speeds
  JOIN geo AS geo_client ON geo_client.ip=speeds.client_ip 
  JOIN geo AS geo_server ON geo_server.ip=speeds.server_ip
GROUP BY
  distance

有你的连接,但请注意,距离计算是在每一行上完成的,有数百万行,你会在那里受到很大的打击。您可以尝试一些事情,也许看看这些其他帖子:

于 2013-01-23T22:14:37.897 回答