Published on

January 29, 2021

Оптимизация операций с данными с помощью команды MERGE в SQL Server

В типичном хранилище данных Microsoft SQL Server обычно выполняются операции INSERT, UPDATE и DELETE в целевой таблице путем сопоставления записей из исходной таблицы. Этот процесс может стать громоздким и затратным по времени при использовании отдельных команд DML. Однако, начиная с SQL Server 2008, разработчики могут использовать команду MERGE для оптимизации этих операций в одном операторе.

Команда MERGE, аналогичная команде UPSERT в Oracle, позволяет вставлять строки, которых нет, и обновлять строки, которые уже существуют в целевой таблице. Она объединяет последовательность условных команд INSERT, UPDATE и DELETE в один атомарный оператор, улучшая производительность и упрощая код.

Вот синтаксис оператора MERGE:

MERGE <целевая_таблица> [AS TARGET]
USING <источник_таблицы> [AS SOURCE]
ON <условие_поиска>
[WHEN MATCHED 
   THEN <merge_matched> ]
[WHEN NOT MATCHED [BY TARGET]
   THEN <merge_not_matched> ]
[WHEN NOT MATCHED BY SOURCE
   THEN <merge_matched> ];

Оператор MERGE работает как отдельные операторы INSERT, UPDATE и DELETE в рамках одного оператора. Вы указываете набор записей “Источник” и таблицу “Цель”, и определяете условие JOIN между ними. Затем вы указываете тип модификации данных, которая должна произойти, когда записи между двумя наборами данных совпадают или не совпадают.

Вот пример использования команды MERGE для синхронизации целевой таблицы с обновленным списком продуктов:

-- Создание целевой таблицы
CREATE TABLE Products
(
   ProductID INT PRIMARY KEY,
   ProductName VARCHAR(100),
   Rate MONEY
) 

-- Вставка записей в целевую таблицу
INSERT INTO Products
VALUES
   (1, 'Чай', 10.00),
   (2, 'Кофе', 20.00),
   (3, 'Маффин', 30.00),
   (4, 'Печенье', 40.00)

-- Создание исходной таблицы
CREATE TABLE UpdatedProducts
(
   ProductID INT PRIMARY KEY,
   ProductName VARCHAR(100),
   Rate MONEY
) 

-- Вставка записей в исходную таблицу
INSERT INTO UpdatedProducts
VALUES
   (1, 'Чай', 10.00),
   (2, 'Кофе', 25.00),
   (3, 'Маффин', 35.00),
   (5, 'Пицца', 60.00)

-- Синхронизация целевой таблицы с обновленными данными из исходной таблицы
MERGE Products AS TARGET
USING UpdatedProducts AS SOURCE 
ON (TARGET.ProductID = SOURCE.ProductID) 
WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName OR TARGET.Rate <> SOURCE.Rate 
THEN UPDATE SET TARGET.ProductName = SOURCE.ProductName, TARGET.Rate = SOURCE.Rate 
WHEN NOT MATCHED BY TARGET 
THEN INSERT (ProductID, ProductName, Rate) VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate)
WHEN NOT MATCHED BY SOURCE 
THEN DELETE 

SELECT * FROM Products

После выполнения приведенного выше кода целевая таблица (Products) будет синхронизирована с обновленными данными из исходной таблицы (UpdatedProducts). Оператор MERGE будет обновлять существующие записи, вставлять новые записи и удалять записи, которых больше нет в исходной таблице.

Оператор MERGE предлагает несколько ключевых преимуществ:

  • Улучшенная производительность: оператор MERGE читает и обрабатывает данные только один раз, в отличие от отдельных операторов INSERT, UPDATE и DELETE, которые оценивают и обрабатывают данные несколько раз.
  • Упрощенный код: оператор MERGE объединяет несколько операций с данными в один оператор, уменьшая сложность и улучшая поддерживаемость кода.
  • Атомарность: оператор MERGE гарантирует, что все модификации данных выполняются как одна атомарная операция, предотвращая несогласованности в данных.

Используя команду MERGE в SQL Server, разработчики могут оптимизировать свои операции с данными и улучшить эффективность своих SQL-скриптов и хранимых процедур.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.