У меня есть два набора измерений Земли из спутниковых данных, каждый с полями времени (mjd для средней юлианской даты) и географическими положениями (GeoPoint, spacial), и я ищу совпадения между двумя наборами, чтобы их время совпадало с порогом 3 часа (или. 125 дней) и их расстояния в пределах 200 км друг от друга.
Я сделал индексы для полей mjd как для таблиц, так и для пространственных таблиц.
Когда я просто включаю ограничение по времени, база данных вычисляет 100 000 совпадений за 8 секунд и вычисляет расстояния для всех 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, а затем - по пространственному индексу (или это то, что он уже делает), и есть ли способ помочь ему, сказав, сколько совпадений ожидать? Если он может вычислить 100 000 совпадений с расстояниями за 8 секунд, у которых 9 меньше 200 км, разве добавление пространственного индекса не сделает его быстрее, а не медленнее?
Спасибо за любые другие советы или идеи.
РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос, как план выглядит без намеков, это (и это занимает вечность):
Также стоит упомянуть, что в одной таблице почти 1 млн записей, а в другой - 8 млн.