Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当SQL Server数据库中有3亿行时,使用SqlBulkCopy超时已过期_Sql_Timeout_Sqlbulkcopy - Fatal编程技术网

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

当SQL Server数据库中有3亿行时,使用SqlBulkCopy超时已过期,sql,timeout,sqlbulkcopy,Sql,Timeout,Sqlbulkcopy,在数据库中现有183M行的特定条件下使用SQLBulkCopy时,在SQL Server数据库中插入约15000行并没有任何问题 但当数据库中存在3亿行时,我遇到了一个例外: 超时已过期。操作完成前已过超时时间,或者服务器没有响应 请注意,没有约束或任何东西,它只是一个非规范化的表 using (var sqlBulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, null)) {

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

但当数据库中存在3亿行时,我遇到了一个例外:

超时已过期。操作完成前已过超时时间,或者服务器没有响应

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

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标准是我正在使用的

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

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


很抱歉,我在帖子中所说的语句出现错误。它应该在一个包含183M行的数据库中插入约15000行。没有问题,但发生了300M行的数据库超时。我认为这两个属性仍然可以帮助您。最简单的方法就是禁用超时,但我可能会将批大小设置为1000左右。如果你关心绩效,可能还有其他事情可以做,但这是一个很好的开始。好的,谢谢Jason,我会尝试你的建议。最初我认为5000是批量大小。有什么指导方针吗?我没见过。我通常将批次数保持在5k或10k以内,但我的目标表没有您的表大(大约20MM的记录)。5公里应该没问题。非常感谢杰森。