大数据批量插入小练习_SqlServer
发布时间:2020-12-12 13:21:33 所属栏目:MsSql教程 来源:网络整理
导读:这几天把sqlserver批量插入也整理了一下,性能方面有很大的提高,下面直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Threading; using
这几天把sqlserver批量插入也整理了一下,性能方面有很大的提高,下面直接上代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Threading; using System.Web; using System.Configuration; using System.Data.SqlClient; using System.Data; using System.Diagnostics; namespace FromSt { ? ?public static class Run_From ? ?{ ? ? ? ?private static int dd = 0; ? ? ? ?public static void InsertForTest(object ss) ? ? ? ?{ ? ? ? ? ? ?InsertData(MakeDT(int.Parse(ss.ToString()))); ? ? ? ? ? ?//Thread st = new Thread(WriterLog); ? ? ? ? ? ?//st.Start(); ? ? ? ?} ? ? ? ?public static void WriterLog() ? ? ? ?{ ? ? ? ? ? ?string ss = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + (dd + 1); ? ? ? ? ? ?using (StreamWriter sw = new StreamWriter(@"d:wService.txt",true,Encoding.GetEncoding("utf-8"),ss.Length)) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?sw.WriteLine(ss); ? ? ? ? ? ?} ? ? ? ?} //创建表 ? ? ? ?public static DataTable MakeDT(int count) ? ? ? ?{ ? ? ? ? ? ?DataTable dt = new DataTable(); ? ? ? ? ? ?//DataColumn dc = new DataColumn ("name1",Type.GetType("System.String")); ? ? ? ? ? ?dt.Columns.AddRange(new DataColumn[]{ ? ? ? ? ? new DataColumn("name",Type.GetType("System.String")), ? ? ? ? ?}); ? ? ? ? ? ?// dt.Columns.Add(dc); ? ? ? ? ? ?Stopwatch sw = new Stopwatch(); ? ? ? ? ? ?sw.Start(); ? ? ? ? ? ?for (int i = 0; i < count; i++) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?DataRow dr = dt.NewRow(); ? ? ? ? ? ? ? ?dr["name"] = "zl" + i; ? ? ? ? ? ? ? ?dt.Rows.Add(dr); ? ? ? ? ? ?} ? ? ? ? ? ?sw.Stop(); ? ? ? ? ? ?double dd = sw.Elapsed.TotalSeconds; ? ? ? ? ? ?return dt; ? ? ? ?} ? ? ? ?public static void InsertData(DataTable dt) ? ? ? ?{ ? ? ? ? ? ?string config = ConfigurationManager.ConnectionStrings["Sql2012"].ConnectionString; ? ? ? ? ? ?try ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?Stopwatch sw = new Stopwatch(); ? ? ? ? ? ? ? ?sw.Start(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SqlBulkCopy sbc = new SqlBulkCopy(config,SqlBulkCopyOptions.UseInternalTransaction); ? ? ? ? ? ? ? ? ? ?sbc.BulkCopyTimeout = 500;//超时时间默认30秒钟 ? ? ? ? ? ? ? ? ? ?sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied); //处理完成指定行数后触发的事件;这里不是必须的; ? ? ? ? ? ? ? ? ? ?sbc.NotifyAfter = dt.Rows.Count; //生成通知事件前要处理的行数 ? ? ? ? ? ? ? ? ? ?sbc.DestinationTableName = "dbo.ss"; //对应数据库的表名 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sw.Stop(); ? ? ? ? ? ? ? ?double dd = sw.Elapsed.TotalSeconds; ? ? ? ? ? ?} ? ? ? ? ? ?catch (Exception ex) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?throw ex; ? ? ? ? ? ?} ? ? ? ?} ? ? //这里实际是可以不用的,但是为了说明用法,我就写了个方法 ? ? ? ?private static void OnRowsCopied(object sender,SqlRowsCopiedEventArgs args) ? ? ? ?{ ? ? ? ? ? ?string ss = ""; ? ? ? ? ? ?ss += args.RowsCopied.ToString() + " rows are copied<Br>"; ? ? ? ?} ? ?} } -- 下面是逐次向表中插入数据的的用时前面表示的条数后面是秒数;注释中的数据表示表中已有数据 select 1000000/16 ?-- 0 ?1个字段 select 1000000/7.90 -- 一百万 ?一个字段 select 1000000/8.97 -- 二百万 ?一个字段 select 1000000/7.60 -- 三百万 ?一个字段 select 1000000/6.54 -- 4百万 ? 一个字段 select 1000000/10.3626133 ?-- 五百万 ?两个字段 select 1000000/8.7146654 ?-- 六百万 ?两个字段 select 1000000/10.2771326 ?-- 八百万 ?两个字段 select 1000000/10.2771326 ?-- 九百万 ? 两个字段 select 1000000/7.4966066 ?-- 一千万 ?两个字段 需要注意下面的事项: 如果在创建表的时候如下面所示,id是自增列有默认值得话,插入式正常的 create(name varchar(50),sex varchar(20),id int identity(1,1)not null); create( id int identity(1,1)not null, name varchar(50),sex varchar(20)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |