当SQL Server数据库中有3亿行时,使用SqlBulkCopy超时



在数据库中现有183M行的特定条件下使用SQLBulkCopy时,我在SQL Server数据库中插入约15000行时没有遇到任何问题。

但当数据库中有300M个现有行时,我遇到了一个异常:

超时已过期。在操作完成或服务器没有响应之前经过的超时时间。

请注意,没有任何约束或任何东西。它只是一个非规范化的表。

using (var sqlBulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, null))
            {
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID,
                    SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP,
                    SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS,
                    SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS,
                    SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE);
                sqlBulkCopy.DestinationTableName =
                    SqlServerDatabaseStrings.SQL_TABLE_HISTORYSAMPLEVALUES;
                sqlBulkCopy.WriteToServer(historySampleValuesDataRow);
                sqlBulkCopy.Close();
            }

有什么想法吗?顺便说一句,SQL Server Standard就是我使用的

sqlBulkCopy对象上有两个属性可以帮助

  • BulkCopyTimeout:这是超时值,默认为30秒。将此值设置为0可完全禁用超时
  • BatchSize:不是直接在表中插入300MM,而是以批量大小插入记录,可能是1MM/次,以防止超时问题(并稍微减轻加载)

参考文献:

  • http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.bulkcopytimeout(v=vs.110).aspx
  • http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.batchsize(v=vs.110).aspx

相关内容

  • 没有找到相关文章

最新更新