广告
返回顶部
首页 > 资讯 > 精选 >SQLServer批量插入数据的方式有哪些
  • 513
分享到

SQLServer批量插入数据的方式有哪些

2023-06-22 03:06:03 513人浏览 薄情痞子
摘要

本篇内容主要讲解“sqlServer批量插入数据的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQLServer批量插入数据的方式有哪些”吧!技术方案一:压缩时间下程序员写出的第一个

本篇内容主要讲解“sqlServer批量插入数据的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQLServer批量插入数据的方式有哪些”吧!

技术方案一:

压缩时间下程序员写出的第一个版本,仅仅为了完成任务,没有从程序上做任何优化,实现方式是利用数据库访问类调用存储过程,利用循环逐条插入。很明显,这种方式效率并不高,于是有了前面的两位同事讨论效率低的问题。

技术方案二:

由于是考虑到大数据量的批量插入,于是我想到了ADO.net2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。这也是我向公司同事推荐的技术方案。

技术方案三:

利用SQLServer2008的新特性--表值参数(Table-Valued Parameter)。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。不过,它也有一个特点:表值参数在插入数目少于 1000 的行时具有很好的执行性能。

技术方案四:

对于单列字段,可以把要插入的数据进行字符串拼接,最后再在存储过程中拆分成数组,然后逐条插入。查了一下存储过程中参数的字符串的最大长度,然后除以字段的长度,算出一个值,很明显是可以满足要求的,只是这种方式跟第一种方式比起来,似乎没什么提高,因为原理都是一样的。

技术方案五:

考虑异步创建、消息队列等等。这种方案无论从设计上还是开发上,难度都是有的。

技术方案一肯定是要被否掉的了,剩下的就是在技术方案二跟技术方案三之间做一个抉择,鉴于公司目前的情况,技术方案四跟技术方案五就先不考虑了。

接下来,为了让大家对表值参数的创建跟调用有更感性的认识,我将写的更详细些,文章可能也会稍长些,不关注细节的朋友们可以选择跳跃式的阅读方式。

再说一下测试方案吧,测试总共分三组,一组是插入数量小于1000的,另外两组是插入数据量大于1000的(这里我们分别取10000跟1000000),每组测试又分10次,取平均值。怎么做都明白了,Let's Go!

1.创建表。

为了简单,表中只有一个字段,如下图所示:

SQLServer批量插入数据的方式有哪些

2.创建表值参数类型

我们打开查询分析器,然后在查询分析器中执行下列代码:

Create Type PassportTableType as Table(PassporTKEy nvarchar(50))

执行成功以后,我们打开企业管理器,按顺序依次展开下列节点--数据库、展开可编程性、类型、用户自定义表类型,就可以看到我们创建好的表值类型了如下图所示:

SQLServer批量插入数据的方式有哪些

说明我们创建表值类型成功了。

3.编写存储过程

存储过程的代码为:

USE [TestInsert]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:<Kevin>-- Create date: <2010-3-1>-- Description:<创建通行证>-- =============================================Create PROCEDURE [dbo].[CreatePassportWithTVP] @TVP PassportTableType readonlyASBEGINSET NOCOUNT ON;Insert into Passport(PassportKey) select PassportKey from @TVPEND

可能在查询分析器中,智能提示会提示表值类型有问题,会出现红色下划线(见下图),不用理会,继续运行我们的代码,完成存储过程的创建

SQLServer批量插入数据的方式有哪些

4.编写代码调用存储过程。

三种数据库的插入方式代码如下,由于时间比较紧,代码可能不那么易读,特别代码我加了些注释。

using System;using System.Diagnostics;using System.Data;using System.Data.SqlClient;using com.DataAccess;namespace ConsoleAppInsertTest{    class Program    {        static string connectionString = SqlHelper.ConnectionStringLocalTransaction;    //数据库连接字符串        static int count = 1000000;           //插入的条数        static void Main(string[] args)        {            //long commonInsertRunTime = CommonInsert();            //Console.WriteLine(string.FORMat("普通方式插入{1}条数据所用的时间是{0}毫秒", commonInsertRunTime, count));            long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();            Console.WriteLine(string.Format("使用SqlBulkCopy插入{1}条数据所用的时间是{0}毫秒", sqlBulkCopyInsertRunTime, count));            long TVPInsertRunTime = TVPInsert();            Console.WriteLine(string.Format("使用表值方式(TVP)插入{1}条数据所用的时间是{0}毫秒", TVPInsertRunTime, count));        }        /// <summary>        /// 普通调用存储过程插入数据        /// </summary>        /// <returns></returns>        private static long CommonInsert()        {            Stopwatch stopwatch = new Stopwatch();            stopwatch.Start();                        string passportKey;            for (int i = 0; i < count; i++)            {                passportKey = Guid.NewGuid().ToString();                SqlParameter[] sqlParameter = { new SqlParameter("@passport", passportKey) };                SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassport", sqlParameter);            }            stopwatch.Stop();            return stopwatch.ElapsedMilliseconds;        }        /// <summary>        /// 使用SqlBulkCopy方式插入数据        /// </summary>        /// <param name="dataTable"></param>        /// <returns></returns>        private static long SqlBulkCopyInsert()        {            Stopwatch stopwatch = new Stopwatch();            stopwatch.Start();            DataTable dataTable = GetTableSchema();            string passportKey;            for (int i = 0; i < count; i++)            {                passportKey = Guid.NewGuid().ToString();                DataRow dataRow = dataTable.NewRow();                dataRow[0] = passportKey;                dataTable.Rows.Add(dataRow);            }            SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);            sqlBulkCopy.DestinationTableName = "Passport";            sqlBulkCopy.BatchSize = dataTable.Rows.Count;            SqlConnection sqlConnection = new SqlConnection(connectionString);            sqlConnection.Open();            if (dataTable!=null && dataTable.Rows.Count!=0)            {                sqlBulkCopy.WriteToServer(dataTable);            }            sqlBulkCopy.Close();            sqlConnection.Close();            stopwatch.Stop();            return stopwatch.ElapsedMilliseconds;        }        private static long TVPInsert()        {            Stopwatch stopwatch = new Stopwatch();            stopwatch.Start();            DataTable dataTable = GetTableSchema();            string passportKey;            for (int i = 0; i < count; i++)            {                passportKey = Guid.NewGuid().ToString();                DataRow dataRow = dataTable.NewRow();                dataRow[0] = passportKey;                dataTable.Rows.Add(dataRow);            }            SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };            SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);            stopwatch.Stop();            return stopwatch.ElapsedMilliseconds;        }        private static DataTable GetTableSchema()        {            DataTable dataTable = new DataTable();            dataTable.Columns.AddRange(new DataColumn[] { new DataColumn("PassportKey") });                        return dataTable;        }    }}

比较神秘的代码其实就下面这两行,该代码是将一个dataTable做为参数传给了我们的存储过程。简单吧。

SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);

5.测试并记录测试结果

第一组测试,插入记录数1000

SQLServer批量插入数据的方式有哪些

第二组测试,插入记录数10000

SQLServer批量插入数据的方式有哪些

第三组测试,插入记录数1000000

SQLServer批量插入数据的方式有哪些

通过以上测试方案,不难发现,技术方案二的优势还是蛮高的。无论是从通用性还是从性能上考虑,都应该是优先被选择的,还有一点,它的技术复杂度要比技术方案三要简单一些,设想我们把所有表都创建一遍表值类型,工作量还是有的。因此,我依然坚持我开始时的决定,向公司推荐使用第二种技术方案。

到此,相信大家对“SQLServer批量插入数据的方式有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: SQLServer批量插入数据的方式有哪些

本文链接: https://www.lsjlt.com/news/302231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQLServer批量插入数据的方式有哪些
    本篇内容主要讲解“SQLServer批量插入数据的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQLServer批量插入数据的方式有哪些”吧!技术方案一:压缩时间下程序员写出的第一个...
    99+
    2023-06-22
  • Oracle中批量插入数据的方式有哪些
    这期内容当中小编将会给大家带来有关Oracle中批量插入数据的方式有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一种:begin   inse...
    99+
    2022-10-18
  • Mybatis批量插入大量数据的方法有哪些
    本文小编为大家详细介绍“Mybatis批量插入大量数据的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis批量插入大量数据的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Mybat...
    99+
    2023-07-05
  • SQLServer 中怎样批量插入数据
    SQLServer 中怎样批量插入数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。运行下面的脚本,建立测试数据库和表值参数。、代码如下:...
    99+
    2022-10-18
  • SQLServer批量插入数据的三种方式及性能对比
    昨天下午快下班的时候,无意中听到公司两位同事在探讨批量向数据库插入数据的性能优化问题,顿时来了兴趣,把自己的想法向两位同事说了一下,于是有了本文。 公司技术背景:数据库访问类(xxx...
    99+
    2022-11-12
  • Mybatis三种批量插入数据的方式
    目录1. 循环插入 2. foreach标签 3. 批处理 三种方式的对比 1. 循环插入 mapper.xml: <?xml version="1.0" enc...
    99+
    2022-11-12
  • Mybatis批量插入数据的两种方式
    总体描述 软件开发过程中需要批量插入数据的场景有几种: 从离线文件(excel, csv等)导入大批量数据到系统。从其它系统定时或者人工同步大批量数据到系统。程序自身的某些算法执行时会生成大批量数据保...
    99+
    2023-09-07
    mybatis java 开发语言 batch insert
  • Mybatis批量插入大量数据最优方式
    Mybatis批量插入的方式有三种 1. 普通插入 2. foreach 优化插入 3. ExecutorType.BATCH插入 下面对这三种分别进行比较: 1.普通插入 默认的插入方式是遍历ins...
    99+
    2023-09-06
    mybatis java mysql
  • SqlServer中BULK INSERT用法简介,批量插入数据
    BULK INSERT是SqlServer中用于批量插入数据的命令。它可以将来自外部文件的数据快速加载到表中,比逐行插入数据的方式更...
    99+
    2023-09-16
    sqlserver
  • springboot 注解方式批量插入数据的实现
    目录一.使用场景二.实现方法1.mysql表结构2.domain3.mapper4.测试类5.测试结果三.插入效率对比1.批量插入2.一条一条插入一.使用场景 一次请求需要往数据库插...
    99+
    2022-11-13
  • Mybatis批量插入大量数据的最优方式总结
    目录Mybatis批量插入的方式有三种下面对这三种分别进行比较:1.普通插入2.foreach 优化插入3.ExecutorType.BATCH插入总结:Mybatis批量插入的方式...
    99+
    2023-03-19
    mybatis大量数据批量insert mybatis 批量插数据 mybatis批量新增数据
  • mssql 中有哪些数据插入方式
    mssql 中有哪些数据插入方式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。--常用的方式代码如下: insert into jobs(jo...
    99+
    2022-10-18
  • python向mySQL批量插入数据的方
    通过调用mySQLdb python库中的 cursor.executemany()函数完成批量处理。 今天用这个函数完成了批量插入 例程: def test_insertDB():     conn = database.Connect...
    99+
    2023-01-31
    批量 数据 python
  • Mysql大数据批量插入方法
    MySQL是当前最流行的关系型数据库之一,大数据批量插入是MySQL中常用的操作之一。在处理大量数据时,如果一条一条地插入会极大地影响效率,因此批量插入是一个更好的选择,可以大大提高数据的处理速度。下面介绍几种MySQL大数据批量插入的方法...
    99+
    2023-09-14
    mysql 大数据 数据库
  • MyBatis批量插入的五种方式
    这里我列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式,进行了详细的总结归纳。 一、准备工作 导入pom.xml依赖 mysql mysql-connector-java runtime or...
    99+
    2023-09-22
    mybatis java mysql
  • 数据库批量插入数据的三种方法
    一、准备工作 测试环境:SpringBoot项目+MybatisPlus框架+MySQL数据库+Lombok 二、导入依赖 org.springframework.boot spring-...
    99+
    2023-08-20
    mysql mybatis spring boot
  • MyBatis 批量插入数据的 3 种方法!
    数据库的最终效果如下: 1.循环单次插入 接下来我们将使用 Spring Boot 项目,批量插入 10W 条数据来分别测试各个方法的执行时间。​ 循环单次插入的(测试)核心代码如下: import com.example.de...
    99+
    2023-09-11
    mybatis java 数据库
  • MySQL实现批量插入测试数据的方式总结
    目录前言表使用函数生成设置允许创建函数创建存储过程执行存储过程总结使用 Navicat自带的数据生成前言 在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者...
    99+
    2023-05-20
    MySQL批量插入测试数据方式 MySQL批量插入数据 MySQL插入数据
  • Android批量插入数据到SQLite数据库的方法
    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数...
    99+
    2022-06-06
    方法 数据 sqlite数据库 SQLite Android
  • jdbc使用PreparedStatement批量插入数据的方法
    目录批量插入1. 批量执行SQL语句2. 高效的批量插入批量插入 1. 批量执行SQL语句 当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作