Tengo dos conjuntos de mediciones de la tierra a partir de datos satelitales, cada uno con campos de tiempo (mjd para la fecha media juliana) y posiciones de geografía (GeoPoint, espacial) y estoy buscando coincidencias entre los dos conjuntos de modo que sus tiempos coincidan con un umbral de 3 horas (o .125 días) y sus distancias a menos de 200 km entre sí.
He hecho índices para los campos mjd en ambas tablas y tablas espaciales.
Cuando acabo de unirme a la restricción de tiempo, la base de datos calcula 100,000 coincidencias en 8 segundos y calcula las distancias para todas las 100,000 coincidencias en ese tiempo. La consulta se ve así:
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) ) )
Y el plan ejecutado es:
Cuando se clasificaron, 9 de las distancias eran inferiores a 200 km, por lo que hay coincidencias. El problema es que cuando agrego la restricción de distancia y ejecuto esto en su lugar,
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) ) )
desaparece por mucho tiempo. Obviamente, en 8 segundos, podría encontrar 100,000 coincidencias de tiempo, 9 de las cuales estaban a menos de 200 km, por lo que el optimizador debe intentar algo subóptimo. El plan es similar al anterior con un filtro en las distancias (supongo).
Puedo forzar el uso del índice espacial con esto:
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) ) )
que luego toma 3 minutos para encontrar 5 coincidencias.
¿Cómo le digo al optimizador de consultas que use primero la búsqueda del índice MJD, y luego el índice espacial (o es eso lo que ya está haciendo) y hay alguna forma de ayudarlo diciéndole cuántas coincidencias esperar? Si puede calcular 100,000 coincidencias con distancias en 8 segundos que tienen 9 por debajo de 200 km, ¿no debería la adición del índice espacial hacerlo más rápido, no más lento?
Gracias por cualquier otro consejo o idea.
EDITAR: Para responder a la pregunta de cómo se ve el plan sin las pistas, esto (y lleva una eternidad):
Quizás también valga la pena mencionar que hay casi 1 millón de registros en una tabla y 8 millones en la otra.