加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQL Server 批量插入数据的两种方法(bulk和表值函数)一

(2012-11-08 14:33:30)
标签:

it

分类: WEB开发

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters)。

运行下面的脚本,建立测试数据库和表值参数。

 

[c-sharp] view plaincopy
  1. --Create DataBase  
  2. create database BulkTestDB;  
  3. go  
  4. use BulkTestDB;  
  5. go  
  6. --Create Table  
  7. Create table BulkTestTable(  
  8. Id int primary key,  
  9. UserName nvarchar(32),  
  10. Pwd varchar(16))  
  11. go  
  12. --Create Table Valued  
  13. CREATE TYPE BulkUdt AS TABLE  
  14.   (Id int 
  15.    UserName nvarchar(32),  
  16.    Pwd varchar(16))  

下面我们使用最简单的Insert语句来插入100万条数据,代码如下:

 

[c-sharp] view plaincopy
  1. Stopwatch sw new Stopwatch();  
  2.   
  3. SqlConnection sqlConn new SqlConnection(  
  4.     ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);//连接数据库  
  5.   
  6. SqlCommand sqlComm new SqlCommand();  
  7. sqlComm.CommandText string.Format("insert into BulkTestTable(Id,UserName,Pwd)values(@p0,@p1,@p2)");//参数化SQL  
  8. sqlComm.Parameters.Add("@p0"SqlDbType.Int);  
  9. sqlComm.Parameters.Add("@p1"SqlDbType.NVarChar);  
  10. sqlComm.Parameters.Add("@p2"SqlDbType.VarChar);  
  11. sqlComm.CommandType CommandType.Text;  
  12. sqlComm.Connection sqlConn;  
  13. sqlConn.Open();  
  14. try  
  15.  
  16.     //循环插入100万条数据,每次插入10万条,插入10次。  
  17.     for (int multiply 0; multiply 10; multiply++)  
  18.      
  19.         for (int count multiply 100000; count (multiply 1) 100000; count++)  
  20.          
  21.   
  22.             sqlComm.Parameters["@p0"].Value count;  
  23.             sqlComm.Parameters["@p1"].Value string.Format("User-{0}"count multiply);  
  24.             sqlComm.Parameters["@p2"].Value string.Format("Pwd-{0}"count multiply);  
  25.             sw.Start();  
  26.             sqlComm.ExecuteNonQuery();  
  27.             sw.Stop();  
  28.          
  29.         //每插入10万条数据后,显示此次插入所用时间  
  30.         Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds"sw.ElapsedMilliseconds));  
  31.      
  32.  
  33. catch (Exception ex)  
  34.  
  35.     throw ex;  
  36.  
  37. finally  
  38.  
  39.     sqlConn.Close();  
  40.  
  41.   
  42. Console.ReadLine();  

耗时图如下:

http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/EntryImages/20090718/1.jpgServer 批量插入数据的两种方法(bulk和表值函数)一" />

由于运行过慢,才插入10万条就耗时72390 milliseconds,所以我就手动强行停止了。

下面看一下使用Bulk插入的情况:

bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库

代码如下:[c-sharp] w plain

  1. public static void BulkToDB(DataTable dt)  
  2.  
  3.     SqlConnection sqlConn new SqlConnection(  
  4.         ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);  
  5.     SqlBulkCopy bulkCopy new SqlBulkCopy(sqlConn);  
  6.     bulkCopy.DestinationTableName "BulkTestTable" 
  7.     bulkCopy.BatchSize dt.Rows.Count;  
  8.   
  9.     try  
  10.      
  11.         sqlConn.Open();  
  12.     if (dt != null && dt.Rows.Count != 0)  
  13.         bulkCopy.WriteToServer(dt);  
  14.      
  15.     catch (Exception ex)  
  16.      
  17.         throw ex;  
  18.      
  19.     finally  
  20.      
  21.         sqlConn.Close();  
  22.         if (bulkCopy != null 
  23.             bulkCopy.Close();  
  24.      
  25.  
  26.   
  27. public static DataTable GetTableSchema()  
  28.  
  29.     DataTable dt new DataTable();  
  30.     dt.Columns.AddRange(new DataColumn[]{  
  31.         new DataColumn("Id",typeof(int)),  
  32.         new DataColumn("UserName",typeof(string)),  
  33.     new DataColumn("Pwd",typeof(string))});  
  34.   
  35.     return dt;  
  36.  
  37.   
  38. static void Main(string[] args)  
  39.  
  40.     Stopwatch sw new Stopwatch();  
  41.     for (int multiply 0; multiply 10; multiply++)  
  42.      
  43.         DataTable dt Bulk.GetTableSchema();  
  44.         for (int count multiply 100000; count (multiply 1) 100000; count++)  
  45.          
  46.             DataRow dt.NewRow();  
  47.             r[0] count;  
  48.             r[1] string.Format("User-{0}"count multiply);  
  49.             r[2] string.Format("Pwd-{0}"count multiply);  
  50.             dt.Rows.Add(r);  
  51.          
  52.         sw.Start();  
  53.         Bulk.BulkToDB(dt);  
  54.         sw.Stop();  
  55.         Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds"sw.ElapsedMilliseconds));  
  56.      
  57.   
  58.     Console.ReadLine();  
  59.  

耗时图如下:

http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/EntryImages/20090718/2.jpgServer 批量插入数据的两种方法(bulk和表值函数)一" />

可见,使用Bulk后,效率和性能明显上升。使用Insert插入10万数据耗时72390,而现在使用Bulk插入100万数据才耗时17583。

最后再看看使用表值参数的效率,会另你大为惊讶的。

SQL Server 批量插入数据的两种方法(bulk和表值函数)二

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有