Самый быстрый способ выполнения вложенных массовых вставок с использованием scope_identity ()?
В одном из наших (C #) приложений мы вставляем / обновляем большой график (сотни вставок и обновлений). Это обернуто в транзакции, потому что мне нужно откатить все это в случае ошибки. Мы используемщеголеватый выполнять операторы SQL.
К сожалению, вся операция в настоящее время занимает от 2 до 8 секунд. Это от 2 до 8 секунд, когда основные таблицы в нашей базе данных заблокированы, что приводит к зависанию других приложений или их блокировке.
Я определил, что одна из операций, вставка в таблицу, содержащую более 120 миллионов записей, занимает большую часть времени, но я не уверен, как мне это оптимизировать.
Грубо говоря, этот граф таблицы настроен следующим образом:
table A (
id int primary_key,
name nvarchar
)
table B (
id int primary_key,
a_id int foreign_key, # has an index
name nvarchar
)
При вставке данных вA
Мне также нужно вставить соответствующие данные вB
, Таким образом, я используюscope_identity()
чтобы получить идентификатор записи и использовать его при вставке записей вB
.
Псевдо-это выглядит следующим образом:
# open transaction
# perform other table inserts
#
# this is one of the slowest operations
for item in list_a
id_a = exec "insert into A (name) values (" + item.name + "); select scope_identity() as int"
for bar in item.list_b
exec "insert into B (id_a, name) values (" + id_a + ", " + bar.name + ")"
#
# perform more operations
# commit transaction
При поиске в Google это может быть связано с транзакцией. Но я не знаю, какова будет производительность, потому что она уже включена в родительскую транзакцию. Это решит проблему?
Второе решение дается путем вставки записей с использованиемunion all select...
, но не знаю, смогу ли я использоватьscope_identity()
в этом призыве.
Как я могу улучшить этот конкретный случай? Что еще я могу сделать, чтобы ускорить работу или не дать другим приложениям пострадать от этих блокировок?