Выберите, где состояние медленное - PullRequest
0 голосов
/ 25 февраля 2020

Мне кажется, что оператор select (который сам по себе очень быстрый) медленнее, чем запись условия в виде строки. Вот фиктивный пример:

Быстрая версия:

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where A.selected_variable in ('XXX','YYY')

Медленная версия:

select 
    selected_variable
    into #t_temp
from db.dbo.some_table
where some_condition = 'X'

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where A.selected_variable in (select selected_variable from #t_temp) -- returns ('XXX','YYY')

Кто-то знает, почему и чего лучше избегать? падение производительности?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Я думаю, что перспектива производительности EXISTS лучше, чем предложение IN. Поскольку предложение IN внутренне преобразуется в условия OR (в результате возникает больше условий)

Попробуйте этот сценарий и сравните план выполнения запроса и время выполнения

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where EXISTS (select 1 
              from db.dbo.some_table t 
              WHERE A.selected_variable = t.selected_variable AND some_condition = 'X') 
0 голосов
/ 25 февраля 2020

Вы можете попробовать приведенную ниже версию, которая позволяет избежать дополнительного ввода-вывода TempDB (что снижает производительность).

Кроме того, проверьте, имеют ли selected_variable, some_condition в some_table правильные индексы.

SELECT A.*
FROM dbo.A AS A
INNER JOIN DBO.some_table AS s 
ON A.Selected_Variable = s.selected_variable
LEFT JOIN dbo.B AS B ON A.id = B.id
WHERE s.some_condition = 'X'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...