sqlserver最大数据导入量(SQL Server批量插入数据案例详解)
类别:数据库 浏览量:164
时间:2021-09-29 01:19:48 sqlserver最大数据导入量
SQL Server批量插入数据案例详解在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters),高效插入数据。
新建数据库:
--Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go
先看下传统的INSERT方式:一条一条的插入(性能消耗越来越大,速度越来越慢)
//使用简单的Insert方法一条条插入 [慢] #region [ simpleInsert ] static void simpleInsert() { Console.WriteLine("使用简单的Insert方法一条条插入"); Stopwatch sw = new Stopwatch(); SqlConnection sqlconn = new SqlConnection("server=.;database=BulkTestDB;user=sa;password=123456;"); SqlCommand sqlcmd = new SqlCommand(); sqlcmd.CommandText = string.Format("insert into BulkTestTable(Id,UserName,Pwd)values(@p0,@p1,@p2)"); sqlcmd.Parameters.Add("@p0", SqlDbType.Int); sqlcmd.Parameters.Add("@p1", SqlDbType.NVarChar); sqlcmd.Parameters.Add("@p2", SqlDbType.NVarChar); sqlcmd.CommandType = CommandType.Text; sqlcmd.Connection = sqlconn; sqlconn.Open(); try { //循环插入1000条数据,每次插入100条,插入10次。 for (int multiply = 0; multiply < 10; multiply++) { for (int count = multiply * 100; count < (multiply + 1) * 100; count++) { sqlcmd.Parameters["@p0"].Value = count; sqlcmd.Parameters["@p1"].Value = string.Format("User-{0}", count * multiply); sqlcmd.Parameters["@p2"].Value = string.Format("Pwd-{0}", count * multiply); sw.Start(); sqlcmd.ExecuteNonQuery(); sw.Stop(); } //每插入10万条数据后,显示此次插入所用时间 Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); } Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } #endregion
循环插入1000条数据,每次插入100条,插入10次,效率是越来越慢。
二.较快速的Bulk插入方式:使用使用Bulk插入[ 较快 ]
//使用Bulk插入的情况 [ 较快 ] #region [ 使用Bulk插入的情况 ] static void BulkToDB(DataTable dt) { Stopwatch sw = new Stopwatch(); SqlConnection sqlconn = new SqlConnection("server=.;database=BulkTestDB;user=sa;password=123456;"); SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlconn); bulkCopy.DestinationTableName = "BulkTestTable"; bulkCopy.BatchSize = dt.Rows.Count; try { sqlconn.Open(); if (dt != null && dt.Rows.Count != 0) { bulkCopy.WriteToServer(dt); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { sqlconn.Close(); if (bulkCopy != null) { bulkCopy.Close(); } } } static DataTable GetTableSchema() { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[] { new DataColumn("Id",typeof(int)), new DataColumn("UserName",typeof(string)), new DataColumn("Pwd",typeof(string)) }); return dt; } static void BulkInsert() { Console.WriteLine("使用简单的Bulk插入的情况"); Stopwatch sw = new Stopwatch(); for (int multiply = 0; multiply < 10; multiply++) { DataTable dt = GetTableSchema(); for (int count = multiply * 100; count < (multiply + 1) * 100; count++) { DataRow r = dt.NewRow(); r[0] = count; r[1] = string.Format("User-{0}", count * multiply); r[2] = string.Format("Pwd-{0}", count * multiply); dt.Rows.Add(r); } sw.Start(); BulkToDB(dt); sw.Stop(); Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); } } #endregion
循环插入1000条数据,每次插入100条,插入10次,效率快了很多。
三.使用简称TVPs插入数据打开sqlserrver,执行以下脚本:
--Create Table Valued CREATE TYPE BulkUdt AS TABLE (Id int, UserName nvarchar(32), Pwd varchar(16))
成功后在数据库中发现多了BulkUdt的缓存表。
使用简称TVPs插入数据
//使用简称TVPs插入数据 [最快] #region [ 使用简称TVPs插入数据 ] static void TbaleValuedToDB(DataTable dt) { Stopwatch sw = new Stopwatch(); SqlConnection sqlconn = new SqlConnection("server=.;database=BulkTestDB;user=sa;password=123456;"); const string TSqlStatement = "insert into BulkTestTable (Id,UserName,Pwd)" + " SELECT nc.Id, nc.UserName,nc.Pwd" + " FROM @NewBulkTestTvp AS nc"; SqlCommand cmd = new SqlCommand(TSqlStatement, sqlconn); SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt); catParam.SqlDbType = SqlDbType.Structured; catParam.TypeName = "dbo.BulkUdt"; try { sqlconn.Open(); if (dt != null && dt.Rows.Count != 0) { cmd.ExecuteNonQuery(); } } catch (Exception ex) { Console.WriteLine("error>" + ex.Message); } finally { sqlconn.Close(); } } static void TVPsInsert() { Console.WriteLine("使用简称TVPs插入数据"); Stopwatch sw = new Stopwatch(); for (int multiply = 0; multiply < 10; multiply++) { DataTable dt = GetTableSchema(); for (int count = multiply * 100; count < (multiply + 1) * 100; count++) { DataRow r = dt.NewRow(); r[0] = count; r[1] = string.Format("User-{0}", count * multiply); r[2] = string.Format("Pwd-{0}", count * multiply); dt.Rows.Add(r); } sw.Start(); TbaleValuedToDB(dt); sw.Stop(); Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); } Console.ReadLine(); } #endregion
循环插入1000条数据,每次插入100条,插入10次,效率是越来越慢,后面测试,将每次插入的数据量增大,会更大的体现TPVS插入的效率。
到此这篇关于SQL Server批量插入数据案例详解的文章就介绍到这了,更多相关SQL Server批量插入数据内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
您可能感兴趣
- sql 基本函数(SQL开窗函数的具体实现详解)
- SQL SERVER存储过程调试
- mysql演示事务提交(MySQL找出未提交事务的SQL实例浅析)
- mysql乐观锁与mvcc(MySQL中的乐观锁,悲观锁和MVCC全面解析)
- phpmysql完全学习手册教程(Windows下搭建PHP开发环境Apache+PHP+MySQL)
- mysqldump备份缺点(MySQL5.7 mysqldump备份与恢复的实现)
- mysql8.0.15安装详细教程(Mysql8.0.22解压版安装教程小白专用)
- mysql数据库出现乱码(数据库 MySQL中文乱码解决办法总结)
- mysql分组函数入门(详解MySQL 数据分组)
- mysql主从复制步骤(MySQL8 主从复制踩坑指南)
- SqlServer 表连接教程(问题解析)(SqlServer 表连接教程问题解析)
- sql语句delete的用法(SQL删除语句DROP、TRUNCATE、 DELETE 的区别)
- sql server 函数参数表(SQL Server 实现数字辅助表实例代码)
- mysql百万数据分页查询优化方案(MySQL单表亿级数据分页怎么优化?)
- sqlserver2000安装之后在哪打开(SQL2000安装后,SQL Server组无项目解决方法)
- mysql慢日志查询作用(MySQL 慢查询日志的开启与配置)
- 九儿《狐踪谍影》出演热血女特警,戏份杀青受关注(九儿狐踪谍影出演热血女特警)
- 红色代表什么(红色代表什么寓意)
- 蓝天代表什么(蓝天代表什么生肖)
- 今天要吃什么(今天要吃什么菜)
- 营养餐是什么(学校营养餐是什么)
- 谁说女子不如男 范冰冰演的武则天只是其一,另外两位你认识吗(谁说女子不如男)
热门推荐
- 计算机改名后无法连接TFS
- tomcat详细配置(Tomcat多实例部署及配置原理)
- vue移动端图片放大效果实现(vue实现图片切换效果)
- python ip代理池(Python 实现域名解析为ip的方法)
- python基础编程函数参数(详解Python 函数如何重载?)
- php开发模式有哪些(PHP设计模式之简单工厂和工厂模式实例分析)
- php redis应用场景(PHP商品秒杀问题解决方案实例详解mysql与redis)
- pythonturtle库画图代码(用Python中的turtle模块画图两只小羊方法)
- dedecms栏目内容怎么插入分页符(dedecms自动给已经发布过的文章中的关键词加超链接)
- python自动化邮件管理(Python实现E-Mail收集插件实例教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9