SQL 服务器批量复制插入百万条记录很慢
SQL Server bulkcopy insert million records is slow
我有一个 table 有 100 万条记录。我需要能够将这些记录移动到另一个数据库和另一个 table.
我正在使用存储过程来获取数据。它填充数据适配器,然后将数据 bcp 到新的 table.
我们正在使用 SQL Server 2005 和 C# 4。我们将迁移到 SQL Server 2012 或 2014 和 Visual Studio 2015,使用 C# 4.6 或 5.0。如果有任何功能可以使它正常工作。
- 对于 10k 条记录,该过程不到 1 秒
- 对于 500k 条记录,数据适配器内存不足,进程失败。
批处理到 100k 条记录,select 语句是 SQL 一次返回 100k 条记录的问题,每个循环需要 2 分钟。
有没有办法,或者我下面的代码有什么问题可以防止数据适配器被填充,而是映射列并让 BulkCopy
留在服务器端,只是将记录从数据库推送到新的 table 可能像 SSIS?
似乎大容量复制本身快如闪电,但适配器填充失败,因为它试图用 100 万条记录填充适配器时内存不足。一次不做 1 行,我只想在 table 秒之间移动数据。
一个 table 有 27 列,其中 5 列不在 table 2 中,后者有 32 列,有些列在两个 table 中的名称不同。
这是概念验证 (PoC)。
sourceConn_transDB.Open();
SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB);
DataTable table = new DataTable();
sourceCommand.CommandTimeout = 600;
using (var adapter = new SqlDataAdapter(sourceCommand))
{
WriteLineWithTime("Adapter Fill");
adapter.Fill(table);
}
if ((table == null) || (table.Rows.Count <= 0))
break;
using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
{
bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
}
您是否尝试过使用带有 IDataReader
的 WriteToServer
重载,那么您根本不需要使用 DataTable
。
sourceConn_transDB.Open();
using(SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB))
{
sourceCommand.CommandTimeout = 600;
using (SqlDataReader reader = sourceCommand.ExecuteReader())
using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
{
bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
bulk.WriteToServer(reader);
}
}
我有一个 table 有 100 万条记录。我需要能够将这些记录移动到另一个数据库和另一个 table.
我正在使用存储过程来获取数据。它填充数据适配器,然后将数据 bcp 到新的 table.
我们正在使用 SQL Server 2005 和 C# 4。我们将迁移到 SQL Server 2012 或 2014 和 Visual Studio 2015,使用 C# 4.6 或 5.0。如果有任何功能可以使它正常工作。
- 对于 10k 条记录,该过程不到 1 秒
- 对于 500k 条记录,数据适配器内存不足,进程失败。 批处理到 100k 条记录,select 语句是 SQL 一次返回 100k 条记录的问题,每个循环需要 2 分钟。
有没有办法,或者我下面的代码有什么问题可以防止数据适配器被填充,而是映射列并让 BulkCopy
留在服务器端,只是将记录从数据库推送到新的 table 可能像 SSIS?
似乎大容量复制本身快如闪电,但适配器填充失败,因为它试图用 100 万条记录填充适配器时内存不足。一次不做 1 行,我只想在 table 秒之间移动数据。
一个 table 有 27 列,其中 5 列不在 table 2 中,后者有 32 列,有些列在两个 table 中的名称不同。
这是概念验证 (PoC)。
sourceConn_transDB.Open();
SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB);
DataTable table = new DataTable();
sourceCommand.CommandTimeout = 600;
using (var adapter = new SqlDataAdapter(sourceCommand))
{
WriteLineWithTime("Adapter Fill");
adapter.Fill(table);
}
if ((table == null) || (table.Rows.Count <= 0))
break;
using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
{
bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
}
您是否尝试过使用带有 IDataReader
的 WriteToServer
重载,那么您根本不需要使用 DataTable
。
sourceConn_transDB.Open();
using(SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB))
{
sourceCommand.CommandTimeout = 600;
using (SqlDataReader reader = sourceCommand.ExecuteReader())
using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
{
bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
bulk.WriteToServer(reader);
}
}