Я бы хотел оптимизировать текущий пакет слияния для сотен тысяч сущностей, используя JDBC 7 и MSSQL 2014.
Синтаксис подготовленного оператора выглядит примерно так:
BEGIN
DECLARE @field1 type1 = ?;
DECLARE @field2 type2 = ?;
MERGE INTO dbo.target_table AS TARGET
USING (SELECT __field1 = @field1, __field2 = @field2) AS SOURCE
ON (TARGET.field1 = SOURCE.__field1)
WHEN MATCHED THEN UPDATE SET field1 = @field1, field2 = @field2
WHEN NOT MATCHED BY TARGET THEN INSERT (field1, field2) VALUES (@field1, @field2);
END
Затем программа связывает значения POJO с объявленными выше переменными.
После прочтения документации SQL Server кажется, что пакетный оператор будет выполняться отдельно на стороне сервера, более того, каждое объединение требует полного поиска в таблице, что можетпривести к длительному времени ожидания.
Интересно, могу ли я оптимизировать процесс, используя DECLARE @my_table_var table(field1 type1, field2 type2)
, вставляя данные в этот @my_table_var
, а затем выполняя слияние, например:
MERGE INTO dbo.target_table AS TARGET
USING @my_table_var AS SOURCE
ON (TARGET.field1 = @my_table_var.field1)
WHEN MATCHED THEN UPDATE SET TARGET.field1 = @my_table_var.field1, TARGET.field2 = @my_table_var.field2
WHEN NOT MATCHED BY TARGET THEN INSERT (field1, field2) VALUES (@my_table_var.field1, @my_table_var.field2);