Почему INTERSECT такой же медленный, как вложенный JOIN? - PullRequest
6 голосов
/ 07 декабря 2010

Я использую 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 на ранней стадии обработки запроса?

1 Ответ

14 голосов
/ 07 декабря 2010

Попробуйте вместо этого. Очевидно, не проверено, но я думаю, что вы получите желаемый результат.

select userid 
    from IncrementalStatistics 
    where IncrementalStatisticsTypeID = 5 
        and IncrementalStatistics.AssociatedPlaceID in (47828,40652,14403)  
        and IncrementalStatistics.Created > '12/2/2010'
    group by userid
    having count(distinct IncrementalStatistics.AssociatedPlaceID) = 3
...