Это может быть удар на самом деле. Суть транзакций не в том, сколько вы делаете, а в том, чтобы поддерживать постоянное обновление данных. Если у вас есть строки, которые нужно вставить вместе и которые зависят друг от друга, это записи, которые вы переносите в транзакции.
Транзакции предназначены для обеспечения согласованности ваших данных. Это должно быть первым, о чем вы думаете при использовании транзакций. Например, если у вас есть дебет (снятие) с вашего текущего счета, вы хотите убедиться, что кредит (депозит) также выполнен. Если какой-либо из них не удастся, всю «транзакцию» следует откатить. Поэтому оба действия ДОЛЖНЫ быть включены в транзакцию.
При выполнении пакетной вставки разбивайте их на 3000 или 5000 записей и просматривайте набор. 3000-5000 был для меня прекрасным диапазоном чисел для вставок; не идите выше этого, если вы не проверили, что сервер может справиться с этим. Кроме того, я добавлю GO в пакет примерно каждые 3000 или 5000 записей для вставок. Обновления и удаления я поставлю GO около 1000, потому что они требуют больше ресурсов для фиксации.
Если вы делаете это из кода C #, то, на мой взгляд, вы должны создать подпрограмму пакетного импорта вместо того, чтобы делать миллионы вставок по одной за раз посредством кодирования.