C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

2023-11-01

  本实验中所用到工具为VS2008和SQL SERVER 2000、SQL SERVER 2008,分别使用5中方法将100万条数据导入SQL 2000与SQL 2008中,实验环境是DELL 2850双2.0GCPU,2G内存的服务器。感兴趣的朋友可以下载源代码自己验证一下所用时间。

  还要有一点需要进行说明,本实验中执行SQL语句的地方使用了IsLine FrameWork框架中的DataProvider模块,这个模块只是对SQL配置的读取和封装,并不会对最终结果有本质性的影响,关于IsLine FrameWork框架方面的知识,请参考“IsLine FrameWork”框架系列文章。

  下面进入正题,分别使用基本的Insert 语句、使用BULK INSERT语句、在多线程中使用BULK INSERT、使用SqlBulkCopy类、在多线程中使用SqlBulkCopy类五种方法,挑战4秒极限。

  数据库方面使用SQL 2000与SQL 2008,表名TableB,字段名称为Value1,数据库名可以在App.config中修改,默认为test。

图 1 试验中的5种方法

  方法一.使用基本的Insert 语句

  这种方法是最基本的方法,大多数人一开始都会想到这种方法。但是Insert语句似乎并不适合大批量的操作,是不是这样呢?

  本方法中将100万数据分为10个批次,每个批次10万条,每10万条1个事务,分10次导入数据库。

  基本语句:Insert Into TableB (Value1) values (‘”+i+”’);

  说明:语句中的i是宿主程序中的一个累加变量,用于填充数据库字段中的值。

  SQL 2000 耗时:901599

  SQL 2008耗时:497638

  方法二.使用BULK INSERT语句

  这个类的效果,在本实验中可以说是最令人满意的了,它的使用最简便、灵活,速度很快。

  “BULK INSERT”语句似乎不是很常用, Aicken听说Oracle中有一种可以将外部文件映射为Oracle临时表,然后直接将临时表中的数据导入Oracle其他表中的方法,这种方法的速度非常令人满意,SQL SERVER的BULK INSERT是不是同样令人满意呢?

  基本语句:BULK INSERT TableB FROM 'c://sql.txt' WITH (FIELDTERMINATOR = ',',ROWTER /.,mbMINATOR='|',BATCHSIZE = 100000)

  说明:“c://sql.txt”是一个预先生成的包含100条数据的文件,这些数据以“|”符号分隔,每10万条数据一个事务。

  SQL 2000耗时:4009

  SQL 2008耗时:10722

  方法三.在多线程中使用BULK INSERT

  在方法二的基础上,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。

  SQL 2000耗时:21099

  SQL 2008耗时:10997

  方法四.使用SqlBulkCopy类

  这种方法速度也很快,但是要依赖内存,对于几千万条、多字段的复杂数据,可能在内存方面会有较大的消耗,不过可以使用64位解决方案处理这个问题。

  几千万条、多字段的数据的情况一般在一些业务场景中会遇到,比如计算全球消费者某个业务周期消费额时,要先获得主数据库表中的会员消费记录快照,并将快照储存至临时表中,然后供计算程序使用这些数据。并且有些时候消费者的消费数据并不在一台数据库服务器中,而是来自多个国家的多台服务器,这样我们就必须借助内存或外存设备中转这些数据,然后清洗、合并、检测,最后导入专用表供计算程序使用。

  基本语句:

  
  
using (System.Data.SqlClient.SqlBulkCopy sqlBC = new System.Data.SqlClient.SqlBulkCopy(conn))
{
sqlBC.BatchSize = 100000 ;
sqlBC.BulkCopyTimeout = 60 ;
sqlBC.DestinationTableName = " dbo.TableB " ;
sqlBC.ColumnMappings.Add( " valueA " , " Value1 " );
sqlBC.WriteToServer(dt);
}

  说明:

  BatchSize = 100000; 指示每10万条一个事务并提交

  BulkCopyTimeout = 60; 指示60秒按超时处理

  DestinationTableName = "dbo.TableB"; 指示将数据导入TableB表

  ColumnMappings.Add("valueA", "Value1"); 指示将内存中valueA字段与TableB中的Value1字段匹配

  WriteToServer(dt);写入数据库。其中dt是预先构建好的DataTable,其中包含valueA字段。

  SQL 2000耗时:4989

  SQL 2008耗时:10412

  方法五.在多线程中使用SqlBulkCopy类

  基于方法四,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。

  SQL 2000耗时:7682

  SQL 2008耗时:10870

  总结

           数据库测试方式

SQL 2000

SQL 2008

基本Insert Into

901599

497638

单线程Bulk Insert

4209

10722

多线程Bulk Insert

21099

10997

单线程SqlBulkCopy

4989

10412

多线程SqlBulkCopy

7682

10870

  以上就是这几天的实验结果了,比较令人失望的是SQL SERVER 2008导入数据的性能似乎并不想我们想象的那样优秀。

  另外,有下载源代码的帮我看看,为什么多线程的成绩还不如单线程的优秀呢?是静态资源使用不当造成的,还是其他什么原因?

  源码地址:http://files.cnblogs.com/isline/sqltest.rar

  测试数据下载地址:http://files.cnblogs.com/isline/Data.rar

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • Spring Bean的生命周期和作用域

    首先我们来介绍Spring Bean的作用域 默认Spring IOC初始化Bean是单例的 及在beanFactory中Bean都是单例 调用getBean的时候 返回的都是同一个Bean对象 SpringBean的五大作用域如下 sin
  • CentOS 7系统安装时不能进入图形化安装界面

    在安装界面 1 光标选中 install centos 7 2 按键盘 TAB 键 3 在内容的最后一行末尾添加上 nodomeset 原因 centos7安装包里自带的显卡驱动不兼容主机上的显卡 nodomeset表示不加载centos7
  • 使用Java的RandomAccessFile类实现大文件分片上传功能

    使用Java的RandomAccessFile类实现大文件分片上传功能 在开发过程中 我们经常会面对需要上传和处理大文件的场景 为了提高效率和降低内存消耗 一种常见的解决方案是将大文件切分成多个小片段进行上传 在本文中 我将详细介绍如何使用
  • Vue创建高德地图,监听地图层级的变化进行操作

    createmap let that this 创建地图 MapLoader then AMap gt that map new AMap Map containerRight zoom that defaultZoom center th
  • Android 蓝牙 hfp音频连接

    Android 蓝牙 hfp音频连接 1 连接音频 2 音频连接状态 该文章基于Android Q 1 连接音频 在手机音频正常连接时 接通电话 点选蓝牙通话 mDeviceManager connectAudio返回true 如果是之前默
  • 【已解决】使用tensorflow报错:ModuleNotFoundError:No module named ‘tensorflow.contrib‘

    问题描述 运行基于tensorflow的代码 原代码在tensorflow v1的基础上编写 当前tensorflow大多是v2 因此运行时会出现下列错误 原有方案 按照博客 需做如下修改 将import tensorflow as tf
  • unity 判断文件夹下是否有指定文件_详解如何提取Unity素材,源码

    一 判断是否是Unity打包及打包方式 如果lib文件夹下有libunity so就证明这是一个unity3d游戏 目前Unity有两种打包方式 Mono和IL2CPP 两者解压后的文件内容也是不相同的 如果MONO里面有很多DLL文件说明
  • kafka sasl_ssl配置

    一 切换到存储证书的路径 我这里在家目录中的创建了ssl文件夹 mkdir ssl cd ssl 二 生成服务端密钥库 keytool keystore server keystore jks alias localhost validit
  • 神经网络与TensorFlow相关知识

    目录 一 全连接的BP神经网络 1 BP back propagation反传播 神经网络 2 全连接神经网络 2 1 全连接神经网络的原理 2 1 1内部运算逻辑 2 1 2 反向传播 2 1 3 为了让Loss最小 求解出最佳的w和b
  • input 标签 (详解)如何去除输入时边框

    去掉input边框
  • Pycharm 翻译插件失效(transaction) 问题解决【含视频教程】

    前言 嗨嗨 大家好 最近有很多朋友反应 翻译插件用不了了 那么今天教大家如何快速解决这个问题 不想看文章的朋友 可以直接点击文章最下方QQ群 领取视频版教程 嘘 偷偷借用我们巳月老师的文章 给你们分享分享吧 嘿嘿 1 点击文件 file g
  • 酷开系统AI智能让生活更简单化

    在一个痴迷于速度和便利性的世界中 AI语音识别创造了一个时代 您可以简单地与您的计算机 智能手机或家庭集线器通信 并获得您正在寻找的答案 而无需在键盘上键入任何内容 现在酷开系统 也开启了AI识别的时代 酷开系统 通过画质识别千万用户画像
  • 【Three.js】第一、二章 入门指南和基础知识

    01 介绍 Three js 非常庞大 你可以用它做无数的事情 在第一章中 我们将学习所有基础知识 例如创建第一个场景 渲染 添加对象 选择正确的材料 添加纹理 为所有内容制作动画 甚至将其放到网上 有些人可能会觉得这部分有点无聊 因为课程
  • DFS与BFS算法

    深度优先遍历简称DFS Depth First Search 广度优先遍历简称BFS Breadth First Search 它们是遍历图当中所有顶点的两种方式 下面分别介绍两种基本的搜索算法 理论介绍 深度优先遍历DFS DFS属于图算
  • Exponentiation&&小数的大数乘法

    Sample Input 95 123 12 0 4321 20 5 1234 15 6 7592 9 98 999 10 1 0100 12 Sample Output 548815620517731830194541 899025343
  • Web自动化之Pytest测试框架

    pytest是一个python的单元测试框架 可以用于自动化测试中 用例规则 pytest命令执行测试时 如果我们不指定具体的文件 PyTest默认从当前路径及其所有子目录中搜索py源文件 所有名字以test 开头或者以 test结尾的py
  • 详解sklearn中的make_moons函数

    make moons是函数用来生成数据集 在sklearn datasets里 具体用法如下 Parameters n samples int optional default 100 The total number of points
  • 加权随机抽样算法

    1 基于均匀分布概率的算法 例如 3等奖抽中的概率是70 2等奖是20 1等奖是10 这样 大部分人都只能中3等奖 小部分人是二等奖 而只有特别少的人才可能拿到一等奖 产生0 100之间的均匀分布的随机数 当随机数在0 70时 就获得3等奖
  • 17 ES6标准入门(Module)

    精华 1 ES6是静态加载 在编译时加载 为静态代码检查提供了更多可能性 2 export实质上是向外提供了接口 正确的语法 export const a 1 export function f 更加推荐的做法 const b 1 cons
  • C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    本实验中所用到工具为VS2008和SQL SERVER 2000 SQL SERVER 2008 分别使用5中方法将100万条数据导入SQL 2000与SQL 2008中 实验环境是DELL 2850双2 0GCPU 2G内存的服务器 感兴