数据导入浅析之---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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值