Агрегировать два выбора с помощью группы в SQL очень медленно - PullRequest
1 голос
/ 10 июля 2009

В настоящее время я работаю с запросом в MSSQL, который выглядит следующим образом:

SELECT
   ...
FROM
(SELECT
   ...
)T1
JOIN
(SELECT
   ...
)T2
GROUP BY
...

Внутренние выборки относительно быстрые, но внешний выбор объединяет внутренние выборки и занимает невероятно много времени для выполнения, часто по тайм-ауту. Удаление группы с помощью делает ее несколько более быстрой, а изменение соединения на LEFT OUTER JOIN также немного ускоряет процесс.

Зачем выполнение группировки с помощью выбора, который объединяет два внутренних выбора, приводит к тому, что запрос выполняется так медленно? Почему INNER JOIN работает медленнее, чем LEFT OUTER JOIN? Что я могу сделать, чтобы устранить эту проблему дальше?

РЕДАКТИРОВАТЬ: Что делает это еще более запутанным, так это то, что два внутренних запроса ограничены датами, и общий запрос выполняется медленно только при просмотре диапазонов дат между началом июля и любым другим днем ​​июля, но если диапазоны дат - любое до 1 июля и сегодня он работает нормально.

Ответы [ 6 ]

1 голос
/ 10 июля 2009

Без более подробной информации о вашем запросе невозможно предложить какие-либо подсказки относительно того, что может ускорить ваш запрос. Возможное предположение состоит в том, что два внутренних запроса блокируют доступ к любым индексам, которые могли быть использованы для выполнения объединения, что привело к большому сканированию, но, вероятно, существует много других возможных причин.

Чтобы проверить, где время используется в запросе, проверьте план выполнения, здесь есть подробное объяснение

http://www.sql -server-performance.com / советы / query_execution_plan_analysis_p1.aspx

Основной прогон - это выполнение запроса и отображение плана выполнения, а затем поиск любых больших процентов - это то, что замедляет ваш запрос.

0 голосов
/ 15 июля 2009

Проблема была с фрагментированными данными. После дефрагментации данных запрос начал выполняться в разумные сроки.

0 голосов
/ 11 июля 2009

После вашего оператора t2 добавьте условие соединения в t1.joinfield = t2.joinfield

0 голосов
/ 11 июля 2009

Вы дали предикат соединения? Т.е. присоединить таблицу A к таблице table.ColA = table.ColB. Если вы не зададите предикат, SQL может быть вынужден использовать вложенные циклы, поэтому, если в этом диапазоне много строк, это объясняет замедление запроса.

Посмотрите на план в студии SQL, если у вас есть MS Sql Server для игры.

0 голосов
/ 11 июля 2009

JOIN = декартово произведение. Все столбцы из обеих таблиц будут объединены в многочисленные перестановки. Это медленный процесс, потому что внутренние запросы запрашивают каждую из отдельных таблиц, но как только они попадают в объединение, он становится декартовым продуктом и становится более сложным в управлении. Это произойдет во внешнем операторе select.

Посмотрите на ВНУТРЕННИЕ СОЕДИНЕНИЯ, как рекомендовано Tetraneutron.

0 голосов
/ 10 июля 2009

Попробуйте переписать запрос без вложенных команд SELECT, которые редко нужны. При использовании вложенных SELECT - за исключением тривиальных случаев - внутренние результирующие наборы SELECT не индексируются, что затрудняет их соединение с чем-либо медленным.

Как сказал Tetraneutron, опубликуйте детали вашего запроса - мы можем помочь вам переписать его простым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...