Подобно этим другим вопросам, указанным ниже, у меня есть две таблицы со структурой:
create table parent (
recno int identity(1,1) primary key not null,
groupCode int,
parentdata varchar(80)
);
create table child (
parentrecno int not null,
childdata varchar(80)
)
Мне нужно быстро вставить несколько сотен тысяч записей в эти таблицы - а таблицы содержат миллионы других записей, не связанных с этой вставкой, и никогда не будут тихими. Из-за родительской / дочерней природы это не лучший кандидат (кажется) для SqlBulkCopy
.
В C # с использованием SqlCommand
с INSERT
я получаю около 400-500 записей в секунду, и это слишком медленно. Псевдокод:
foreach(Record r in parentRecords)
{
Insert Fields from r into SqlCommand Parameters but not "recno"
Call ExecuteScalar to insert and fetch the inserted identity value (recno)
foreach(ChildRecord cr in parentRecords.Children)
{
Insert Fields from cr into SqlCommand Parameters
Insert the identity value (recno) from above into Parameters
(as parentrecno)
Call ExecuteNonQuery to insert the record
}
}
После прочтения других постов у меня возникла мысль. groupCode
, прикрепленный к родительским записям, уникален для того набора родительских записей, который я вставляю. Будет ли работать:
- Массовая вставка родительских записей с
SqlBulkCopy
, позволяя вставке автоматически генерировать поле идентификатораrecno
, как обычно. Выполните
SELECT
только для вставленных записей:select recno from parent where groupCode = @thisgroup order by recno;
Используйте полученные значения, чтобы заполнить
parentrecno
поля для дочерних записей в памяти.- Массовая вставка дочерних записей с
SqlBulkCopy
Это будет полагаться на родительские записи, входящие в таблицу SQL в том же порядке, что и в исходной таблице DataTable (и присвоение значений идентификаторов в том же порядке). Могу ли я положиться на это?
Связанные вопросы:
SqlBulkCopy и DataTables с отношениями родитель / потомок в столбце идентичности < / а>