J'ai deux ensembles de mesures terrestres à partir de données satellites, chacun avec des champs temporels (mjd pour la date moyenne julienne) et des positions géographiques (GeoPoint, spatial) et je cherche des coïncidences entre les deux ensembles de sorte que leurs temps correspondent à un seuil de 3 heures (ou 0,125 jours) et leurs distances à moins de 200 km les uns des autres.
J'ai fait des index pour les champs mjd sur les tables et les tables spatiales.
Lorsque je viens de me joindre à la contrainte de temps, la base de données calcule 100 000 correspondances en 8 secondes et calcule les distances pour les 100 000 correspondances de cette période. La requête ressemble à ceci:
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) ) )
Et le plan exécuté est:
Une fois triées, 9 des distances étaient inférieures à 200 km, il y a donc des matchs. Le problème est que lorsque j'ajoute la contrainte de distance et l'exécute à la place,
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) ) )
ça part longtemps. De toute évidence, en 8 secondes, il a pu trouver 100 000 matchs dans le temps, dont 9 sous 200 km, l'optimiseur doit donc essayer quelque chose de sous-optimal. Le plan ressemble à ci-dessus avec un filtre sur les distances (je suppose).
Je peux forcer l'utilisation de l'index spatial avec ceci:
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) ) )
ce qui prend ensuite 3 minutes pour trouver 5 correspondances.
Comment puis-je dire à l'optimiseur de requête d'utiliser d'abord l'index MJD, puis l'index spatial ensuite (ou est-ce déjà ce qu'il fait) et existe-t-il un moyen de l'aider en lui indiquant le nombre de correspondances à attendre? S'il peut calculer 100 000 matchs avec des distances en 8 secondes qui ont 9 à moins de 200 km, l'ajout de l'indice spatial ne devrait-il pas le rendre plus rapide et non plus lent?
Merci pour tout autre conseil ou idée.
EDIT: Pour répondre à la question à quoi ressemble le plan sans les indices, ceci (et cela prend une éternité):
Il vaut peut-être aussi la peine de mentionner qu'il y a presque 1 million d'enregistrements dans une table et 8 millions dans l'autre