SQL Server IN vs = в запросе (для одного значения)

Прежде всего, извините за смутное название темы (я не мог придумать что-то лучше).

Ответ SO заставил меня задуматься о том, действительно ли какое-либо влияние на производительность, когда я бросаю = для IN.

select 1 id, 'abc' name into #a union 
select 2, 'abcd' union 
select 3, 'abcde' 

select * from #a where id = 1 ------ Query 1
select * from #a where id in (1)------ Query 2

Я проверил планы запросов для обоих запросов и нашел их для меня одинаковыми (возможно, пример был упрощенным, возможно, поэтому).

Но нарушаю ли я лучшую практику производительности при использовании IN? Конечно, это должно быть связано с IN может обрабатывать несколько предметов и даже SELECTS, я знаю IN предлагает гораздо больше с точки зрения возможностей, но для случаев, когда есть несколько записей для id = 1,

select * from #a where id = (SELECT id from #a where id = 1)------ Query 3
select * from #a where id in (SELECT id from #a where id = 1)------ Query 4

query3 потерпит неудачу, а query4 будет работать. Таким образом, я хотел бы заменить = с IN в будущем в моем коде. Но я хочу знать о любых возможных компромиссах.

РЕДАКТИРОВАТЬ Мне просто интересно узнать, как (иначе?) Движок SQL обрабатывает эти утверждения.

3 ответа

Игнорирование аспекта производительности вашего вопроса, если можно, здесь есть проблема дизайна. Вы должны кодировать свое намерение, чтобы, когда кто-то еще читал ваш код, он имел больше шансов понять, чего вы пытались достичь. Вы ожидаете SELECT id from #a where id = 1 вернуть ровно одну запись? Если это так, используйте "=". Если вы ожидаете, что он вернет ноль или более, тогда '=' будет неправильным.

В общем-то IN будет разбит на несколько = предикаты и те, которые будут использоваться для удовлетворения запроса. При использовании для индекса (при условии), как в вашем примере, отдельные предикаты будут использоваться для операции поиска по индексу. Попробуй сам. Посмотрите на предикаты поиска в операции "Поиск индекса" вашего плана выполнения.

Насколько мне известно, эффективность индекса - это единственное соображение между "=" и "in". Поэтому, если вы хотите воспользоваться индексом, вам нужно использовать "=".

Оператор "in" не подлежит обсуждению. "=" - раздражительно.

В запросах 3 и 4, вероятно, будет выполняться дополнительное сканирование таблиц в подзапросе, поэтому вы потеряете эффективность по сравнению с объединением.

Другие вопросы по тегам