10 лет я пользовался предикатом IN,
не подозревая, что получаю неверные результаты.
Выяснил случайно, заметив, что на больших объемах
IN работает крайне медленно.
Итак.
SELECT COUNT(*) FROM TABLE1 A WHERE A.FIELD1 NOT IN (SELECT B.FIELD2 FROM TABLE2 B)
SELECT COUNT(*) FROM TABLE1 A WHERE NOT EXISTS (SELECT * FROM TABLE2 B WHERE B.FIELD2=A.FIELD1)
Так вот с точки зрения логики оба запроса одинаковы.
Но, оказывается, первый будет вести себя не предсказуемо
в случае если в колонке FIELD1 или FIELD2 содержатся NULL-значения.
Причем, на поведение влияет некий параметр из-за которого по разному
интерпритируются нулевые значения.
Кроме того, второй запрос в отличие от первого не выполняет полный
перебор на поиск значения, а прерывается при нахождении значения).
Кроме T-SQL SQLSERVER, аналогично ведет себя запрос и в Oracle.
Так что будьте внимательны, когда пишите свой код!
не подозревая, что получаю неверные результаты.
Выяснил случайно, заметив, что на больших объемах
IN работает крайне медленно.
Итак.
SELECT COUNT(*) FROM TABLE1 A WHERE A.FIELD1 NOT IN (SELECT B.FIELD2 FROM TABLE2 B)
SELECT COUNT(*) FROM TABLE1 A WHERE NOT EXISTS (SELECT * FROM TABLE2 B WHERE B.FIELD2=A.FIELD1)
Так вот с точки зрения логики оба запроса одинаковы.
Но, оказывается, первый будет вести себя не предсказуемо
в случае если в колонке FIELD1 или FIELD2 содержатся NULL-значения.
Причем, на поведение влияет некий параметр из-за которого по разному
интерпритируются нулевые значения.
Кроме того, второй запрос в отличие от первого не выполняет полный
перебор на поиск значения, а прерывается при нахождении значения).
Кроме T-SQL SQLSERVER, аналогично ведет себя запрос и в Oracle.
Так что будьте внимательны, когда пишите свой код!
Столкнулся с этим на собеседовании. Спасибо, теперь разобрался
ОтветитьУдалитьНет проблем, кстати, на собеседованиях часто спрашивают банальные вещи, оценивая память человека и его багаж(опыт, образование и т.п.), а не самого человека. Поэтому хорошая память и быстрая реакция очень важны при собеседовании. Мне знание этого факта не помогло(поставили задачу не указав ключевой столбец, т.е. задача не имела решения). Вообщем, это все неважно. Думаю вот написать пару статей про D(ди) - высокоуровневый язык для системного и прикладного программирования.
ОтветитьУдалить