Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определение несоответствий записей  [new]
Aleksey br
Member

Откуда:
Сообщений: 73
Всем привет.
есть две таблицы с идентификаторами Table1 и Table2.
В них постоянно разное к-во строк и мне нужно их сравнивать.
Помогите разобраться как быстрее всего выводить список идентификаторов.
SELECT id 
FROM Table1 
WHERE id not in 
(SELECT id FROM Table2)


или все-таки
SELECT id
FROM Table1 
WHERE not EXISTS
    (SELECT id FROM Table2
	 WHERE ID = 
            Table1 .id)


По плану запроса одинаковые значения, а по времени выполнения то один, то другой "выигрывает".
9 ноя 17, 12:04    [20939538]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
SELECT [T1.id]=T1.id. [T2.id]=T2.id
FROM Table1 T1
FULL JOIN Table2 T2 ON T1.id=T2.id
WHERE T1.id IS NULL OR T2.id IS NULL;
9 ноя 17, 12:06    [20939550]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
Aleksey br
Member

Откуда:
Сообщений: 73
iap,

Пожалуй, я неправильно выразился:
я всегда сравниваю Table1 с Table2 и ,в случае появления новых id (которых еще нет в Table2), выполняю с ними процедуру.
а сравнивать несколько миллионов строк - это минута-две в моем случае...
9 ноя 17, 12:19    [20939592]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Aleksey br
iap,

Пожалуй, я неправильно выразился:
я всегда сравниваю Table1 с Table2 и ,в случае появления новых id (которых еще нет в Table2), выполняю с ними процедуру.
а сравнивать несколько миллионов строк - это минута-две в моем случае...
И что? Я неправильный запрос предложил?
Ответ на исходный вопрос: NOT EXISTS всегда лучше, чем NOT IN.
В том числе из-за потенциальной возможности возврата NULL в подзапросе.
В данном случае, правда, это исключено, раз речь идёт об id.
9 ноя 17, 12:23    [20939608]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
dies irae
Member

Откуда:
Сообщений: 78
по моему опыту not in часто тупит. К тому же логически оператор in это подмножество exists, и, в принципе, избыточен. чуть короче разве что
9 ноя 17, 12:23    [20939609]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
dies irae
по моему опыту not in часто тупит. К тому же логически оператор in это подмножество exists, и, в принципе, избыточен. чуть короче разве что

он не тупит, а у него другая логика на обработку UNKNOWN. Но принципально не задумываясь лучше NOT EXISTS использовать
9 ноя 17, 12:44    [20939690]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20519
А вариант
SELECT id 
FROM Table1 
LEFT JOIN Table2 ON Table1.id = Table2.id
WHERE Table2.id IS NULL

Вы вообще не рассматриваете? а почему?
9 ноя 17, 12:55    [20939759]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
Aleksey br
Member

Откуда:
Сообщений: 73
Akina,

Рассматривал - результат не особо отличается
9 ноя 17, 13:15    [20939830]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Aleksey br, сравните еще с

SELECT id
FROM Table1 
EXCEPT
SELECT id 
FROM Table2


У меня он показывает одинаковые результаты c not exists, так что это дело вкуса, в целом. Не стоит использовать только not in.
9 ноя 17, 14:39    [20940226]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9344
Aleksey br
Пожалуй, я неправильно выразился:
я всегда сравниваю Table1 с Table2 и ,в случае появления новых id (которых еще нет в Table2), выполняю с ними процедуру.
а сравнивать несколько миллионов строк - это минута-две в моем случае...
Откуда серверу знать про новые строки, "которых еще нет в Table2"? Поэтому вы обречены сравнивать несколько миллионов строк, пока не научите сервер сразу находить нужные.
Например, если гарантированно новые id в Table1 всегда больше предыдущих, то можно примерно так
SELECT id 
FROM Table1 
WHERE id > isnull((SELECT MAX(id) FROM Table2), -1)

Либо воспользуйтесь какм-либо штатным механизмом. Например, Change Tracking
9 ноя 17, 15:31    [20940518]     Ответить | Цитировать Сообщить модератору
 Re: Определение несоответствий записей  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
ТС, а какую именно задачу ты решаешь?
Может от этого плясать? Вот пока понятно, что ты решил что нужно сравнивать многомилионных множества.
Но не исключено, что исконная задача не сравнивать, а какая-то другая. И твое решение только одно из возможных...
9 ноя 17, 16:00    [20940615]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить