SQL - IN против НЕ IN

Предположим, у меня есть таблица со столбцом, которая принимает значения от 1 до 10. Мне нужно выбрать столбцы со всеми значениями, кроме 9 и 10. Будет ли разница (с точки зрения производительности) при использовании этого запроса:

SELECT * FROM tbl WHERE col NOT IN (9, 10)

и этот?

SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8)
 Royi Namir03 июн. 2013 г., 09:16
извини, ты прав. удаление.
 kyooryu03 июн. 2013 г., 09:20
@Martin Smith - я рассматривал это как теоретическую ситуацию, я не собираюсь использовать эти запросы :)
 Martin Smith03 июн. 2013 г., 09:13
BETWEEN 1 AND 8 было бы предпочтительнее, хотя и не стоило бы тратить какое-то время, даже рассматривая проблему для такого маленького стола. Ваша реальная ситуация отличается?
 Martin Smith03 июн. 2013 г., 09:38
Ах ямы только что заметили, что таблица сама по себе нет обязательно маленький. Он просто имеет 10 различных значений. Может быть миллион строк, соответствующих каждому значению. В том случае, если есть индекс покрытия с первым столбцом I 'col1я предпочитаюBETWEEN тогдаIN
 a_horse_with_no_name03 июн. 2013 г., 09:21
Производительность также будет сильно различаться в зависимости от используемой СУБД. Всегда сначала проверяйте план выполнения, затем выя увижу.
 Robert McKee03 июн. 2013 г., 09:31
Будет ли разница в производительности? Вполне возможно, но что быстрее будет зависеть от того, какой сервер SQL вы используете, насколько хорошо это 'Оптимизатор, ваши индексы, как недавно и насколько он точенs строки статистики и распределение значений col.

Ответы на вопрос(4)

SELECT * FROM tbl WHERE ((col <> 9 and col <> 10))

То же самое для другого, с 8 раз= вместо.

Так что да, первый будет быстрее, меньше сравнений. Шансы на то, что это измеримо, ничтожно малы, но издержки при горстке постоянных сравнений ничто по сравнению с общими издержками при разборе SQL и получении данных.

 Martin Smith03 июн. 2013 г., 09:30
ОП не имеетт сказал нам, что RDBMS они, но AFAIK в MySQLIN со списком констант реализовано с помощью бинарного поиска по списку, а не 8= сравнения.
 Niels Keurentjes03 июн. 2013 г., 09:33
Даже если бы это было (я никогда не рассчитываю на MySQL, чтобы делать какие-либопродвинутый» оптимизация, самое безопасное предположение) это делает второй теоретически немного медленнее, потому что тамЕще больше сравнений.

что у Oracle были проблемы с оптимизацией некоторых запросов с NOT IN, если столбцы обнуляемы. Если вы можете написать свой запрос в любом случае, IN предпочтительнее, чем яЯ обеспокоен.

Решение Вопроса

вы всегда должны профилировать свой код (то есть выполнять запросы несколько тысяч раз и измерять производительность каждого цикла с использованием некоторого вида.stopwatchОбразец).

Но здесь я настоятельно рекомендую использовать первый запрос для лучшего ведения в будущем. Логика в том, что вам нужны все записи, кроме 9 и 10. Если вы добавите значение 11 в свою таблицу и используете второй запрос, логика вашего приложения будет нарушена, что, конечно, приведет к ошибке.

Редактировать: Я помню, это было помечено как php 'Поэтому я предоставил пример в php, но я могу ошибаться. Я думаю, это победилоТяжело переписать этот пример на языке, который выповторное использование.

В" поскольку это, скорее всего, заставит СУБД использовать индекс для соответствующего столбца. "

НЕ В" теоретически может быть также переведено на использование индекса, но более сложным способом, который не может сделать СУБД »тратить время с помощью.

Ваш ответ на вопрос