加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

数据导入浅析之---SqlBulkCopy(转载)

发布时间:2020-12-12 15:08:08 所属栏目:MsSql教程 来源:网络整理
导读:1.使用场景:经常在业务数据需要进行同步或者需要进行结算或者进行汇总的时候,我们往往需要将大量的明细数据,销售数据或者流水记录等数据导入到一个汇总的地方(一般是总部公司等)。 2.使用该类的组织架构情况: ?? 一般为:销售组织将各种1中所述数据传

1.使用场景:经常在业务数据需要进行同步或者需要进行结算或者进行汇总的时候,我们往往需要将大量的明细数据,销售数据或者流水记录等数据导入到一个汇总的地方(一般是总部公司等)。

2.使用该类的组织架构情况:

?? 一般为:销售组织将各种1中所述数据传至其管控的组织(如:销售门店或零售点或营业点

------>分公司或销售总部等)

3.出现问题:

在做大批量数据插入的时候,如果用Insert into ... values (...)这种方式的话效率极低,一般统计来看,10万条数据都需要3到4分钟左右,50万条数据都快8分钟左右,100万条数据 的情况下一般都可能达到13-15分钟,这三项检测都通过Oracle检验过(sql大致一样),那么,我们如何来处理这种大理数据的迁移或者同步,回写呢?微软的.net内库中有一个SqlBulkCopy类

4.SqlBulkCopy类中有一个WriteToServer 方法,MSDN中介绍如下:

将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

5.现在开始测试:

???? 测试思想:

1).先构建一个四个字段的表

???? 表结构如下:

??CREATE TABLE [dbo].[A_Test](
[PrimaryKey] [bigint] IDENTITY(1,1) NOT NULL,
[ABC] [varchar](10) NULL,
[EFG] [varchar](20) NULL,
[TEST] [varchar](25) NULL,
CONSTRAINT [PK_A_Test] PRIMARY KEY CLUSTERED
(
[PrimaryKey] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

2).构建一个DataTable如下:

   //1000000条数据导入测试
??????????? //利用sqlbulkcopy类实现
??????????? DataTable db = new DataTable();
??????????? db.Columns.Add("ABC",typeof(string));
??????????? db.Columns.Add("EFG",typeof(string));
??????????? db.Columns.Add("TEST",typeof(string));
??????????? for(int i = 0 ;i<1000000;i++)
??????????? {
??????????????? DataRow dr = db.NewRow();
??????????????? dr["ABC"]="ABC"+i.ToString();
??????????????? dr["EFG"]="EFG"+i.ToString();
??????????????? dr["TEST"]="TEST"+i.ToString();
??????????????? db.Rows.Add(dr);
??????????? }

3).开始计时,并开始做相关导入工作

    DateTime dt1 = DateTime.Now;
??????????????? SqlConnection conn = new SqlConnection(Connstring);
??????????????? conn.Open();
??????????????? using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
??????????????? {
??????????????????? //设置一个批,写入多少条记录???????
??????????????????? sqlBC.BatchSize = 100000;???????
??????????????????? //设置逾时的秒数???????
??????????????????? sqlBC.BulkCopyTimeout = 60;????????
??????????????????? //设置 NotifyAfter 属性,以便在每拷贝 10000 条记录至数据表后,呼叫事件处理函数???????
??????????????????? sqlBC.NotifyAfter = 10000;
??????????????????? //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
??????????????????? sqlBC.DestinationTableName = "dbo.A_Test";
??????????????????? //对应数据行???????
??????????????????? sqlBC.ColumnMappings.Add("ABC","ABC");
??????????????????? sqlBC.ColumnMappings.Add("EFG","EFG");
??????????????????? sqlBC.ColumnMappings.Add("TEST","TEST");
??????????????????? //开始写入???????
??????????????????? sqlBC.WriteToServer(db);
??????????????? }
??????????????? conn.Dispose();
??????????????? DateTime dt2 = DateTime.Now;
??????????????? dt0 = dt2 - dt1;
??????????????? return true;

4).查看结果:

   


该实验时间肯定比正常需要的时间多很多,因为我是在开发很多别的软件的情况下跑的(正常理想数据应该是4秒左右),但在此只想说明一个问题,如此在处理Sqlserver的大量或海量数据的导入的时候,建议使用Sqlbulkcopy这个类。。以提高程序的效率。有一篇博客可以看看:

http://www.cnblogs.com/hunterllb/archive/2008/05/19/1202800.html,

http://www.cnblogs.com/isline/archive/2010/03/18/1688783.html(这个比较经典)其方式更优,也很有意思

?

转自:http://hi.baidu.com/xyz136299110/blog/item/0f5ce8012a65c31f738b6530.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读