【问题标题】:Single insert vs. muliple inserts单个插入与多个插入
【发布时间】:2013-12-24 12:50:17
【问题描述】:

我正在迭代一个(二进制)文件并在表中插入一些值。 收到值后,我将它们逐行插入到数据库中。

我的部分代码(示例值):

string sColumn1 = Getcolumn1Value();
string sColumn2 = Getcolumn2Value();

string sqlIns = "INSERT INTO table (column1, column2) " +
                      "VALUES (@column_1, @column_2)";

SqlCommand cmdInsPacket = new SqlCommand(sqlIns, connection);

cmdInsPacket.Parameters.AddWithValue("@column_1", sColumn1);
cmdInsPacket.Parameters.AddWithValue("@column_2", sColumn2);

cmdInsPacket.ExecuteNonQuery();
cmdInsPacket.Parameters.Clear();

因为有数百万条记录,我想知道插入一组(例如 500 条)而不是一个接一个是否更好。

有什么好的建议可以解决这个问题(我的建议(组插入)有用吗)

(MS SQL Server 2008 R2 和 C#)

【问题讨论】:

  • 您应该查找批量插入
  • 如果有数百万条记录,我认为您正在使用 Excel 表,所以通过 Excel 将数据上传到 SQL SERVER。
  • 不是 Excel 工作表! (这是一个二进制文件 - 专有格式)无法在 SQL 服务器中直接导入。
  • 你好 Robertico 什么是二进制文件?
  • @Nayeem Mansoori:不包含纯文本,但需要处理字节。但这不是我的问题。单次插入工作正常,但正在寻找加快插入速度的解决方案

标签: c# sql sql-server-2008 bulkinsert


【解决方案1】:

您可以使用SqlBulkCopy 插入多条记录。您可以将记录放在数据表中,并在一次调用中将它们保存到数据库中。

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))     
{
    bulkCopy.DestinationTableName =  "dbo.BulkCopyDemoMatchingColumns";
    try
    {
        bulkCopy.WriteToServer(newProducts);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

【讨论】:

  • IMO,这应该是评论,因为它不是(直接的、独立的)答案。
  • 超过 2 列,内存使用情况(数据表)如何?也想避免使用数据表(如果可能的话)
【解决方案2】:

如果您有 DataTable 格式的数据,请使用这个简单的功能。

function static void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable bulkData)
{
    using(SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial     Catalog=yourDB;Integrated Security=SSPI;"))
    {
         dbConnection.Open();
         using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
         {
            s.DestinationTableName = "Your table name";
            foreach (var column in bulkData.Columns)
            s.ColumnMappings.Add(column.ToString(), column.ToString());
            s.WriteToServer(bulkData);
         }
    }
}

【讨论】:

  • 我没有 DataTable 格式的数据,而是来自 foreach 循环。我是否需要创建一个等于 SQL 表的数据表并用 500/1000 行填充它,然后运行批量复制、清除表..再次填充等?
  • 那你有什么类型的数据?
  • 你的意思是:[column1] [char] (45) NULL, [column2] [datetime2](7) NULL, [column3] [char](15) NULL, [column4] [ char](15) NULL, [column5] [int] NULL, [column6] [int] NULL, [column7] [char](3) NULL, [column8] [int] NULL, [column9] [char](17 ) NULL, [column10] [char](17) NULL 大约。每个文件 1,200,000 条记录,每批最多 40,000,000 条
  • 这是你的表定义对吧?但是你说你有一个二进制文件。因此,如果您可以读取它并使用循环将其存储到 DataTable 中。那么你有一个新的数据表。所以用它来存储到 SQL 表中
  • DataTable的内存使用情况如何。 SQL DB 约为。 1.6 GB 用于 12,003,024 条记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2014-08-12
  • 2011-03-22
  • 1970-01-01
  • 2021-07-18
  • 2016-04-03
相关资源
最近更新 更多