当前位置:  开发笔记 > 编程语言 > 正文

批量插入在Azure SQL Server中无法正常工作

如何解决《批量插入在AzureSQLServer中无法正常工作》经验,为你挑选了1个好方法。

我无法使用C#webapi将大量数据插入Azure SQL服务器数据库

考虑

我想在SQL中插入60K>数据。在我的本地sql服务器中没有问题,但是在Azure SQL中,它的连接超时

我的方法:(所有人都在本地sql服务器中工作,但不在Azure sql服务器中工作)

1)使用EF对其插入记录进行一次尝试(10000次约10分钟,大多数情况下超时)

2)尝试将批量插入扩展与EF一起使用3)尝试在SqlBulkCopy中

4)尝试增加连接字符串中的连接超时

5)尝试在Dbcontext中增加命令超时。

异常StackTrace

Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)

在Azure中是否有任何解决方案或要更改的配置?

更新资料

用于批量插入的代码

  using (var dbConnection = new DBModel().Database.Connection as SqlConnection)
                {
                    dbConnection?.Open();
                    using (var sqlBulkCopy = new SqlBulkCopy(dbConnection))
                    {
                        try
                        {
                            /* ColumnMapping
                             * Column is mapped to DB Column to DataTable Column
                             *
                             */
                            sqlBulkCopy.EnableStreaming = true;
                            sqlBulkCopy.BulkCopyTimeout = 500;
                            sqlBulkCopy.DestinationTableName = "LogTable";
                            //dt is object of the Datatable
                            sqlBulkCopy.WriteToServer(dt);
                        }
                        catch (Exception ex)
                        {

                        }
                    }


                }

小智.. 5

我建议您将其设置sqlBulkCopy.BatchSize为合理的数量,而不是将所有内容批量插入。根据要插入的数据,尝试从10.000开始,然后上下移动,直到对性能满意为止。

编辑以获得更多说明:考虑批处理大小时,需要考虑SqlBulkCopy不仅需要插入数据,还需要读取并发送数据-最后一部分可能是其在本地运行的原因SQL Server,但是不在Azure上-这还意味着,如果要使用大型数据集,则需要使用较小的批处理大小或相当大的BulkCopyTimeout设置,以使每个批处理有机会在达到超时限制。

您可以在这篇文章中阅读有关批量大小的更多信息。 SqlBulkCopy的建议批处理大小是多少?

其他选择:
我正在阅读此书,这可能仅仅是因为您的插入内容达到了关键的DTU(数据库事务单元,基本上是对服务器组合资源的一种度量)使用点。

对性能级别进行了校准和控制,以提供所需的资源来运行数据库工作负载,直至达到所选服务层/性能级别所允许的最大限制。如果您的工作负载达到CPU /数据IO /日志IO限制之一的限制,您将继续以允许的最大级别接收资源,但是查询的等待时间可能会增加。这些限制不会导致任何错误,而只会导致您的工作负载减慢,除非该减慢变得如此严重以至于查询开始超时

从此链接获取:https : //azure.microsoft.com/da-dk/blog/azure-sql-database-introduces-new-near-real-time-performance-metrics/
尝试在监视DTU的同时再次启动副本使用情况,并查看它是否长时间(100%)使用。在这种情况下,您可能希望提高数据库的定价层规模。



1> 小智..:

我建议您将其设置sqlBulkCopy.BatchSize为合理的数量,而不是将所有内容批量插入。根据要插入的数据,尝试从10.000开始,然后上下移动,直到对性能满意为止。

编辑以获得更多说明:考虑批处理大小时,需要考虑SqlBulkCopy不仅需要插入数据,还需要读取并发送数据-最后一部分可能是其在本地运行的原因SQL Server,但是不在Azure上-这还意味着,如果要使用大型数据集,则需要使用较小的批处理大小或相当大的BulkCopyTimeout设置,以使每个批处理有机会在达到超时限制。

您可以在这篇文章中阅读有关批量大小的更多信息。 SqlBulkCopy的建议批处理大小是多少?

其他选择:
我正在阅读此书,这可能仅仅是因为您的插入内容达到了关键的DTU(数据库事务单元,基本上是对服务器组合资源的一种度量)使用点。

对性能级别进行了校准和控制,以提供所需的资源来运行数据库工作负载,直至达到所选服务层/性能级别所允许的最大限制。如果您的工作负载达到CPU /数据IO /日志IO限制之一的限制,您将继续以允许的最大级别接收资源,但是查询的等待时间可能会增加。这些限制不会导致任何错误,而只会导致您的工作负载减慢,除非该减慢变得如此严重以至于查询开始超时

从此链接获取:https : //azure.microsoft.com/da-dk/blog/azure-sql-database-introduces-new-near-real-time-performance-metrics/
尝试在监视DTU的同时再次启动副本使用情况,并查看它是否长时间(100%)使用。在这种情况下,您可能希望提高数据库的定价层规模。

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有