我有两组来自卫星数据的地球测量数据,每组都有时间字段(均值朱利安日期为mjd)和地理位置(GeoPoint,空间),并且我正在寻找两组数据之间的重合,以使它们的时间与阈值相匹配。 3小时(或0.125天),且彼此之间的距离不超过200公里。
我已经为表和空间表上的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条距离在200公里以下,因此有比赛。问题是,当我添加距离约束并改为运行它时,
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个匹配项低于200 km,因此优化程序必须尝试一些次优的匹配项。该计划看起来与上面类似,但对距离进行了过滤(我猜是这样)。
我可以这样强制使用空间索引:
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) ) )
然后需要3分钟才能找到5个匹配项。
我如何告诉查询优化器先使用MJD索引查找,然后再使用空间索引(或者这是它已经在做什么),有什么办法可以告诉它预期有多少个匹配项来帮助它?如果它能在8秒内计算出100,000个匹配项,且距离在200公里之内有9个,那么增加空间索引是否就可以使速度更快而不是变慢?
感谢您提出任何其他提示或想法。
编辑:要回答没有提示的计划是什么样的问题,这(并且要花很多时间):
也许还值得一提的是,一个表中几乎有100万条记录,而另一张表中有800万条记录