微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐