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, вероятно, будет выполняться дополнительное сканирование таблиц в подзапросе, поэтому вы потеряете эффективность по сравнению с объединением.