В чем разница следующих подходов в выборке?

Всем хорошего настроения!
В данных двух подходах результат один и тот же, но первый тратит на выборку 30мс, а второй 30сек. В чем принципиальное отличие?
Вариант 1
SELECT [FormId], count(F.Id)
  FROM [Application].[FormFieldsDataContent] F with(nolock) join
		(select Id from [Schema].ProjectForms with(nolock) where Period_id in (902,855)) A on F.FormId=A.Id
  where PeriodId in (902,855) 		
group by [FormId]

Вариант 2
SELECT [FormId], count(F.Id)
  FROM [Application].[FormFieldsDataContent] F with(nolock) join
		[Schema].ProjectForms A with(nolock) on F.FormId=A.Id and F.PeriodId=A.Period_id
  where A.Period_id in (902,855) 		
group by [FormId]
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Во втором надо условие Period_id in (902,855)) перенести во фразу join, вот так:
SELECT [FormId], count(F.Id)
  FROM [Application].[FormFieldsDataContent] F with(nolock) join
    [Schema].ProjectForms A with(nolock) on A.Period_id in (902,855)  and F.FormId=A.Id and F.PeriodId=A.Period_id
group by [FormId]

Видимо у вас таблица ProjectForms большая, без этого условия в нужном месте из нее выбираются все данные, удолвлетворяющие условию (F.FormId=A.Id and F.PeriodId=A.Period_id), а потом, уже из результирующей большой выборки делается отбор A.Period_id in (902,855).
В первом примере это условие стоит во вложенном запросе, соответственно вложенная выборка будет значительно меньше.
На самом деле вложенные запросы, как правило выполняются дольше joinов, поэтому мой вариант, скорее всего будет работать еще быстрее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы