Варианты сравнения записей в таблицах
Пересказ статьи Chad Callihan. Options to Compare Table Records
Недавно мы рассматривали сравнение схем с помощью Azure Data Studio. Что если нам потребуется сравнение таблиц с помощью запроса? В этой статье мы сравним использование EXCEPT, NOT IN, и NOT EXISTS для нахождения различий в двух таблицах.
Мы будем сравнивать две таблицы Comic и Comic_Copy. В Comic содержится на 48 строк больше, чем в Comic_Copy. Давайте найдем отличие.
Давайте начнем сравнение с EXCEPT. При использовании EXCEPT мы захотим иметь одинаковое число и порядок столбцов, а также одинаковые типы данных. Мы удовлетворяем этим критериям в нашем примере, поэтому давайте выполним наш запрос и посмотрим на результаты:
Мы видим 48 строк, что правдоподобно, исходя из подсчетов, которые мы рассматривали ранее.
Теперь мы будем использовать NOT IN для сравнения таблиц. Выберем Id из таблицы Comic, и будем использовать подзапрос, чтобы получить идентификаторы в Comic_Copy:
Мы опять получаем наши 48 строк.
Наконец, давайте проверим NOT EXISTS.
Если мы выполним все три запроса вместе, какой покажет себя лучше остальных?
EXCEPT не кажется лучшим вариантом, в то время как два других варианта демонстрируют одинаковый план. Мы работаем с относительно небольшим набором данных, поэтому выполнение каждого запроса занимает менее секунды с одним и тем же числом логических чтений.
Хотя NOT IN и NOT EXISTS работают по-разному. Для NULL-значений NOT IN не вернет записей, поскольку NULL-значения не трактуются как сравниваемые. При использовании NOT EXISTS NULL также будут возвращаться.
Если мы изменим одно из значений title на NULL:
и выполним запросы на сравнение по Title, то получим разные результаты. NOT IN даст нам 47 строк:
А NOT EXISTS по-прежнему дает 48:
Мы рассмотрели три разных метода нахождения различий между таблицами. Все три варианта с использованием EXCEPT, NOT IN и NOT EXISTS могут выполнить работу, но разными способами. NOT EXISTS был бы моим "выбором" для оптимального поиска различий, но имейте в виду наличие NULL при сравнении с помощью NOT IN.
EXCEPT
Давайте начнем сравнение с EXCEPT. При использовании EXCEPT мы захотим иметь одинаковое число и порядок столбцов, а также одинаковые типы данных. Мы удовлетворяем этим критериям в нашем примере, поэтому давайте выполним наш запрос и посмотрим на результаты:
SELECT Id,Title
FROM Comic
EXCEPT
SELECT Id,Title
FROM Comic_Copy;
GO
Мы видим 48 строк, что правдоподобно, исходя из подсчетов, которые мы рассматривали ранее.
NOT IN
Теперь мы будем использовать NOT IN для сравнения таблиц. Выберем Id из таблицы Comic, и будем использовать подзапрос, чтобы получить идентификаторы в Comic_Copy:
SELECT Id, Title
FROM Comic
WHERE Id NOT IN (
SELECT Id
FROM Comic_Copy
);
GO
Мы опять получаем наши 48 строк.
NOT EXISTS
Наконец, давайте проверим NOT EXISTS.
SELECT Id, Title
FROM Comic AS c
WHERE NOT EXISTS (
SELECT 1
FROM Comic_Copy AS cc
WHERE cc.Id = c.Id
);
GO
Что работает лучше?
Если мы выполним все три запроса вместе, какой покажет себя лучше остальных?
EXCEPT не кажется лучшим вариантом, в то время как два других варианта демонстрируют одинаковый план. Мы работаем с относительно небольшим набором данных, поэтому выполнение каждого запроса занимает менее секунды с одним и тем же числом логических чтений.
Хотя NOT IN и NOT EXISTS работают по-разному. Для NULL-значений NOT IN не вернет записей, поскольку NULL-значения не трактуются как сравниваемые. При использовании NOT EXISTS NULL также будут возвращаться.
Если мы изменим одно из значений title на NULL:
UPDATE Comic
SET Title = NULL
WHERE ID = 2210;
GO
и выполним запросы на сравнение по Title, то получим разные результаты. NOT IN даст нам 47 строк:
А NOT EXISTS по-прежнему дает 48:
Переходим на NOT EXISTS
Мы рассмотрели три разных метода нахождения различий между таблицами. Все три варианта с использованием EXCEPT, NOT IN и NOT EXISTS могут выполнить работу, но разными способами. NOT EXISTS был бы моим "выбором" для оптимального поиска различий, но имейте в виду наличие NULL при сравнении с помощью NOT IN.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой