Я использую 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 тыс. Результатов. </p>
Я бы ожидал, что SQL внутренне сгенерирует результаты каждого из этих подзапросов в хеш-таблицу и выполнит хеш-пересечение - должно быть O (n),Результирующие наборы достаточно велики, чтобы уместиться в памяти, поэтому я сомневаюсь, что это проблема ввода-вывода.
Я написал альтернативный запрос, представляющий собой просто последовательность вложенных JOIN, и это также занимает около 20 секунд, что имеет смысл.
Почему INTERSECT такой медленный?Это сводится к JOIN на ранней стадии обработки запроса?