Я использую MS SQL.
У меня есть огромная таблица с индексами, чтобы сделать этот запрос быстрым:
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 47828 and
IncrementalStatistics.Created > '12/2/2010
Он возвращается менее чем за 1 секунду. В таблице миллиарды строк. Есть только около 10000 результатов.
Я ожидаю, что этот запрос также завершится примерно через секунду:
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 47828 and
IncrementalStatistics.Created > '12/2/2010'
intersect
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 40652 and
IncrementalStatistics.Created > '12/2/2010'
intersect
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 14403 and
IncrementalStatistics.Created > '12/2/2010'
Но это занимает 20 секунд. Все отдельные запросы занимают ‹ 1 секунды и возвращают около 10 000 результатов.
Я ожидаю, что SQL внутренне выдаст результаты каждого из этих подзапросов в хеш-таблицу и сделает хэш-пересечение - должно быть O (n). Наборы результатов достаточно велики, чтобы поместиться в памяти, поэтому я сомневаюсь, что это проблема ввода-вывода.
Я написал альтернативный запрос, который представляет собой просто серию вложенных JOIN, и это также занимает около 20 секунд, что имеет смысл.
Почему INTERSECT работает так медленно? Сводится ли это к JOIN на ранней стадии обработки запроса?