Saya memiliki dua set pengukuran bumi dari data satelit, masing-masing dengan bidang waktu (mjd untuk tanggal julian rata-rata) dan posisi geografi (GeoPoint, spasi) dan saya mencari kebetulan di antara dua set sehingga waktu mereka cocok dengan ambang batas 3 jam (atau 0,125 hari) dan jaraknya dalam jarak 200 km.
Saya telah membuat indeks untuk bidang mjd di kedua tabel dan tabel spasial.
Ketika saya baru saja bergabung dengan batasan waktu, basis data menghitung 100.000 kecocokan dalam 8 detik dan menghitung jarak untuk semua 100.000 kecocokan pada waktu itu. Kueri terlihat seperti ini:
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) ) )
Dan rencana yang dijalankan adalah:
Saat disortir, 9 jaraknya berada di bawah 200km, jadi ada yang cocok. Masalahnya adalah, ketika saya menambahkan batasan jarak dan menjalankan ini sebagai gantinya,
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) ) )
itu hilang untuk waktu yang lama. Jelas, dalam 8 detik, dapat menemukan 100.000 pertandingan yang sesuai, 9 di antaranya berada di bawah 200 km, sehingga pengoptimal harus mencoba sesuatu yang kurang optimal. Rencananya terlihat mirip dengan di atas dengan filter pada jarak (saya menduga).
Saya bisa memaksakan penggunaan indeks spasial dengan ini:
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) ) )
yang kemudian membutuhkan 3 menit untuk menemukan 5 pertandingan.
Bagaimana saya memberi tahu pengoptimal kueri untuk menggunakan pencarian indeks MJD pertama, dan kemudian indeks spasial kedua (atau apakah itu yang sudah dilakukannya) dan apakah ada cara saya dapat membantu dengan memberi tahu berapa banyak kecocokan yang diharapkan? Jika ia dapat menghitung 100.000 pertandingan dengan jarak dalam 8 detik yang memiliki 9 di bawah 200km, bukankah seharusnya penambahan indeks spasial membuatnya lebih cepat, bukan lebih lambat?
Terima kasih atas kiat atau ide lain.
EDIT: Untuk menjawab pertanyaan seperti apa rencana itu tanpa petunjuk, ini (dan ini akan berlangsung selamanya):
Mungkin juga layak disebutkan bahwa ada hampir 1 juta catatan di satu meja dan 8 juta di yang lain