Самый быстрый способ выполнения вложенных массовых вставок с использованием 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() в этом призыве.

Как я могу улучшить этот конкретный случай? Что еще я могу сделать, чтобы ускорить работу или не дать другим приложениям пострадать от этих блокировок?

Ответы на вопрос(1)

Ваш ответ на вопрос