Member 12885549 Ответов: 1

Ускорьте работу 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

Что я здесь делаю не так? Как я могу улучшить скорость?

1 Ответов

Рейтинг:
0

Gerry Schmitz

Поместите все свои данные на сервер, прежде чем получать фантазии. Без прямой нагрузки в качестве ориентира вы просто спотыкаетесь в темноте.


Member 12885549

Я не уверен, что понял вашу точку зрения.