1

私は2つのテーブルを持っています.1つは大まかに次のようになります:

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

もう 1 つは地理データを持っています。

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

2 つの IP アドレス間の大円距離を計算し、それによってグループ化し、平均速度を計算する選択クエリを作成したいと思います。したがって、たとえば、理想的な出力は次のようになります。

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

SQL で大圏距離を取得するための優れたリソースがあることは知っていますが、2 つのテーブルがかなり大きい (数百万行) ため、2 つのテーブルを効率的に結合する方法について頭が少し曇っています。

何かアドバイス?

4

2 に答える 2

1

geo データ テーブル内の IP が一意であると仮定すると、実際にはそれほど高価な結合ではありません。server_ip 列に一意でない値を含むテーブルから結合している場合でも、それが外部結合であることをシステムに伝える必要はありません。「速度」テーブルの各行に 1 つ、 client_ip と一致する IP テーブル内のエントリは 1 つだけ、server_ip と一致する IP テーブル内のエントリは 1 つだけです。したがって、問題なく内部結合を使用できます。

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 に答える