0

X 座標と Y 座標を表す 2 つの float 列を含む単純なテーブルがあります。非クラスター化インデックスは、これら 2 つの列のそれぞれにあります。このテーブルには、このような SQL を使用してカスタム グリッドにグループ化したい約 500 万のデータポイントがあります。

SELECT COUNT(X) Count, AVG(X) CenterX, AVG(Y) CenterY
FROM DataPoints
GROUP BY FLOOR(X / 5), FLOOR(Y / 5)

テスト ケースでは、815000 ポイントのデータ セットをグリッドに分割し、各ポイントが独自のグリッド セルを取得しました。SQL Server 2012が結果を提供するのに26000 ミリ秒かかりましたが、これは明らかに長すぎます。シンプルなポイント配列で LINQ を使用して同じグループ化の C# 実装を作成しましたが、 3450msしかかかりませんでした。スピードアップのために SQL のストアド プロシージャも作成しましたが、それでもグリッド セルの計算に 26 ~ 30 秒かかります。

SQL Server がこれらのグループを計算するのに時間がかかる理由がわかりません。すべての 815000 ポイントでグリッド セル インデックスを計算するには時間がかかることはわかっていますが、単純な C# プログラムよりも 7 倍長いというのは現実的な結果ではありません。

また、空間型を使用してグリッドを計算しようとしましたが、これらのソリューションはさらに遅くなります。ジオメトリ列と空間インデックス (GEOMETRY_AUTO_GRID) を使用するとsp_help_spatial_geometry_histogram、データを含む 4 つのグリッド セルを計算するのに 2:40 分かかります。

このような単純な SQL を高速化する方法を知っている人はいますか? 将来、このデータはブラウザのマップに送信され、多くのリクエストが発生するため、100 ミリ秒未満が最終的な目標になります。

4

1 に答える 1