Tôi có hai bộ số đo trái đất từ dữ liệu vệ tinh, mỗi bộ có các trường thời gian (mjd cho ngày julian trung bình) và vị trí địa lý (GeoPoint, spacial) và tôi đang tìm kiếm sự trùng hợp giữa hai bộ sao cho thời gian của chúng khớp với ngưỡng 3 giờ (hoặc 0,125 ngày) và khoảng cách của chúng trong phạm vi 200 km với nhau.
Tôi đã tạo các chỉ mục cho cả các trường mjd trên cả bảng và bảng không gian.
Khi tôi chỉ tham gia vào giới hạn thời gian, cơ sở dữ liệu sẽ tính toán 100.000 trận đấu trong 8 giây và tính khoảng cách cho tất cả 100.000 trận đấu trong thời gian đó. Truy vấn trông như thế này:
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) ) )
Và kế hoạch thực hiện là:
Khi được sắp xếp, 9 trong số các khoảng cách là dưới 200km, do đó, có các trận đấu. Vấn đề là, khi tôi thêm ràng buộc khoảng cách và chạy cái này thay vào đó,
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) ) )
nó biến mất trong một thời gian dài. Rõ ràng, trong 8 giây, nó có thể tìm thấy 100.000 trận đấu thời gian, 9 trong số đó dưới 200km, vì vậy trình tối ưu hóa phải thử một thứ gì đó tối ưu. Kế hoạch trông tương tự như trên với một bộ lọc về khoảng cách (tôi đoán).
Tôi có thể buộc sử dụng chỉ số không gian với điều này:
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) ) )
mà sau đó mất 3 phút để tìm 5 trận đấu.
Làm cách nào để tôi nói với trình tối ưu hóa truy vấn sử dụng chỉ mục MJD tìm kiếm trước, và sau đó là chỉ số không gian thứ hai (hoặc đó là những gì nó đang làm) và có cách nào tôi có thể giúp nó bằng cách cho nó biết có bao nhiêu kết quả khớp không? Nếu nó có thể tính toán 100.000 trận đấu với khoảng cách trong 8 giây có 9 dưới 200km, không nên thêm chỉ số không gian làm cho nó nhanh hơn không chậm hơn?
Cảm ơn cho bất kỳ lời khuyên hoặc ý tưởng khác.
EDIT: Để trả lời câu hỏi kế hoạch trông như thế nào mà không có gợi ý, điều này (và phải mất mãi mãi):
Cũng có thể đáng nói là có gần 1 triệu bản ghi trong một bảng và 8 triệu trong bảng khác