【问题标题】:Quickest Way to Copy SQL Data复制 SQL 数据的最快方法
【发布时间】:2011-03-10 17:43:00
【问题描述】:

我可以使用一些建议/想法。 我编写了一个控制台应用程序,它将 MS Access 中的表(我知道,但我继承了它)中的所有数据查询到 SQL 表。它每天早上作为计划任务运行。两个表之间的字段不相同。目前我从 MS Access 表中选择所有数据,遍历数据集并将每一行插入 SQL 表中。在此过程中,我还编写了一个快速日志文件。它有效,但速度不快。如果您有任何改进流程的想法,我将不胜感激。 谢谢!

【问题讨论】:

    标签: asp.net sql ms-access console-application


    【解决方案1】:

    SqlBulkCopy Class

    它比单个 insert 语句快方式

    您必须为主键增加自己的身份字段值。为此,首先获取您上次离开的身份字段值:

    select top 1 id_customer from customers order by id_customer desc

    然后在循环访问 DataSet 时增加一个 int 变量。

    或者您也可以使用GUID for primary key column

    使用 SqlBulkCopy 的示例代码:

    public static void BulkLoadDataTable(DataTable table, string destinationTable)
    {
      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(_connectionString))
      {
        bulkCopy.BulkCopyTimeout = 1200;
        bulkCopy.DestinationTableName = destinationTable;
        bulkCopy.WriteToServer(table);
      }
    }

    强类型数据表:

    using System;
    using System.Data;
    
    public class CustomersDataTable : DataTable
    {
      public CustomersDataTable() : base()
      {
        base.TableName = "Customers";
        Columns.Add(new DataColumn("id_customer", typeof(int)));
        Columns.Add(new DataColumn("first_name", typeof(string)));
        Columns.Add(new DataColumn("last_name", typeof(string)));
        Columns.Add(new DataColumn("active", typeof(bool)));
      }
    }

    【讨论】:

    • 只有在插入数百万条记录的极端情况下才需要创建自己的主键。但我同意 John 的观点,即 SqlBulkCopy 是要走的路。
    • 看起来 BulkCopyClass 是要走的路。但是,当字段属性不匹配时会发生什么?例如 access 中的字符串字段和 SQL 中的布尔字段。
    • 那么您可以遍历您的数据并完全按照您在 SQL Server 中想要的方式构建DataTable,即“bool”的“bit”列。 SQL Server 应该能够将无类型 DataTable 中的数据点转换为架构中的正确类型,但就个人而言,我会创建一个强类型数据表(见上文)。您还可以写出 .CSV 并批量复制它。在代码中循环完成所有这些工作将花费相对较少的时间。要点是 1000 条单独的 insert 语句将浪费 TONS 时间!
    • 谢谢 JohnB - 你的建议很有效。创建强类型 DataTable 后,执行工作不到一秒(之前大约需要 30 秒)。
    【解决方案2】:

    你看过 SSIS 包吗?我会先调查一下。如果您无权访问,请查看此处已经提到的 SqlBulkCopy 类。

    您也可以考虑使用SELECT statement with an INSERT

    【讨论】:

    • 带有 INSERT 的 SELECT 语句会很慢。
    • 是的,但它仍然比单个插入更快。这将是我最后的选择,但我想我会提出这个选择。在我看来,SSIS 将是正确的选择。
    • 为什么使用带有 SELECT 语句的 INSERT 进行批量插入会很慢?
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2011-02-13
    • 1970-01-01
    • 2017-06-14
    • 2020-08-18
    相关资源
    最近更新 更多