我有两组来自卫星数据的地球测量值,每组都有时间字段(平均儒略日期mjd)和地理位置(GeoPoint,空间),我希望找到这两组之间的巧合,使它们的时间在3小时(或0.125天)的阈值内相符,并且它们的距离相互之间在200公里以内。
我已经为两个表的mjd字段和空间表建立了索引。
当我只根据时间约束进行连接时,数据库在8秒钟内计算出100,000个匹配项,并在此期间计算出所有100,000个匹配项的距离。查询如下所示:
执行的计划如下: 当排序后,有9个距离在200公里以下,所以存在匹配。问题是,当我添加距离约束并运行这个时,
它消失了很长一段时间。显然,在8秒内,它可以找到100,000个时间匹配,其中有9个距离在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公里以下,所以优化器肯定正在尝试一些次优的方法。计划看起来与上述类似,只是增加了一个距离过滤器(我猜的)。 我可以通过这个来强制使用空间索引:
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秒内计算出具有9个小于200公里距离的100,000个匹配项,那么加入空间索引不应该使它更快而不是更慢吗?
感谢任何其他提示或想法。
编辑:回答没有提示时计划是什么样子的,就是这样的(而且花费很长时间):
也许值得一提的是,一个表中有近100万条记录,另一个表中有800万条记录。