衛星データからの2つの地球測定値セットがあり、それぞれに時間フィールド(平均ユリウス日付のmjd)と地理的位置(GeoPoint、空間)があり、2つのセット間の一致が時間のしきい値に一致するように探しています3時間(または.125日)およびそれらの距離は互いに200 km以内です。
テーブルと空間テーブルの両方のmjdフィールドにインデックスを作成しました。
時間の制約に参加するだけで、データベースは8秒で100,000回の一致を計算し、その時間内のすべての100,000回の一致の距離を計算します。クエリは次のようになります。
select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
実行された計画は次のとおりです。
並べ替えると、9つの距離が200km未満であったため、一致します。問題は、距離制約を追加して代わりにこれを実行すると、
select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
and h.GeoPoint.STDistance(m.GeoPoint)<200000
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
それは長い間消えます。明らかに、8秒で100,000回のタイムマッチが見つかり、そのうち9回は200km未満であったため、オプティマイザは次善の方法を試行している必要があります。プランは、距離にフィルターを使用した上記と似ています(推測しています)。
これで空間インデックスの使用を強制できます:
select top 5 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.GeoPoint.STDistance(m.GeoPoint)<200000
and h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD), index(ix_GeoPoint) ), table hint( m, index(ix_MJD) ) )
一致するものが5つ見つかるまで3分かかります。
最初にMJDインデックスシークを使用し、次に空間インデックスを使用するようにクエリオプティマイザーに指示する方法(または既に実行していることです)、どのくらい一致するかを予測する方法を教えてください。200 km未満で9の距離で8秒間に100,000の一致を計算できる場合、空間インデックスを追加することで速度が遅くなるのではないでしょうか?
他のヒントやアイデアをありがとう。
編集:ヒントなしで計画がどのように見えるかという質問に答えるために、これ(そしてそれは永遠にかかります):
1つのテーブルにはほぼ1Mのレコードがあり、もう1つのテーブルには8Mのレコードがあることに言及する価値があるかもしれません