Ускорьте работу sqlbulkcopy .netcore
Я действительно становлюсь невежественным здесь. Я импортирую ~2 миллиона строк в свою базу данных SQL azure. Я создаю временную таблицу, в которую помещаю свои значения, когда использую технику слияния для вставки только тех строк, которые не имеют дубликатов. Мой код и скрипты приведены ниже.
Что я уже пробовал:
public async Task BulkImportWithoutDuplicates(DataTable reader) { var tableName = "##tempImport"; using (var connection = new SqlConnection(sqlCOnn.ConnectionString)) { using (SqlCommand command = new SqlCommand("", sqlCOnn)) { try { sqlCOnn.Open(); //Creating temp table on database command.CommandText = Scripts.GetTempTableScript(); command.ExecuteNonQuery(); //Bulk insert into temp table using (SqlBulkCopy b = new SqlBulkCopy(conString, SqlBulkCopyOptions.TableLock)) { b.BulkCopyTimeout = 0; b.BatchSize = reader.Rows.Count; b.DestinationTableName = tableName; await b.WriteToServerAsync(reader); b.Close(); } // Updating destination table, and dropping temp table command.CommandText = Scripts.GetMergeScript(); var rows = command.ExecuteNonQuery(); } catch (Exception ex) { // Handle exception properly } finally { connection.Close(); } } } } public static string GetTempTableScript() { return $@" IF OBJECT_ID('tempdb.dbo.##tempImport', 'U') IS NOT NULL BEGIN DROP TABLE ##tempImport; END CREATE TABLE ##tempImport ( ... all the columns);"; } public static string GetMergeScript() { return $@"MERGE INTO dbo.Data AS target USING ##tempImport AS source ON (source.TransactionId = target.TransactionId AND source.UserId = target.UserId) WHEN NOT MATCHED THEN INSERT (Start, Spend, UserId, Product, Shop, ClientId, UploadDataId, UniqueId, TransactionId, q, cq, c2) VALUES (source.Start, source.Spend, source.UserId, source.Product, source.Shop, source.ClientId, source.UploadDataId, source.UniqueId, source.TransactionId, source.q, source.c1, source.c2); "; }
Я действительно не понимаю, почему это занимает много времени, пока он не закончит. Я ждал 24 минуты, пока он не был добавлен к временному столу в одиночку. Я читал эту статью, и мне кажется, что это не займет много времени. https://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html?m=1
Что я здесь делаю не так? Как я могу улучшить скорость?