MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒
这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类
MSDN是这样描述的:
ConcurrentQueue<T> 类是一个线程安全的先进先出 (FIFO) 集合。
ConcurrentQueue<T> 的所有公共且受保护的成员都是线程安全的,可从多个线程同时使用。
共采用两个线程,一个读一个写。
ConcurrentQueue<T>的实现方法:
(FIFO) 集合:
ConcurrentQueue<DataTable> DataTableList = new ConcurrentQueue<DataTable>();
读:
private void MainThread()
{
if (DataTableList.Count < _pageCount)//小于队列最大值后即可再次获取一次
{
for (int index = ; index < _pageCount; index++)
{
DataTable dt = null;
try
{
int counts = index == ? index : (index * PageSize - );
dt = MySql.GetDataTable(counts, PageSize);
DataTableList.Enqueue(dt);
Console.WriteLine("Read {0}\t{1}/{2}", DateTime.Now.ToString("HH:mm:ss.fff"), index, counts);
}
catch (Exception)
{ }
ThreadPool.QueueUserWorkItem(Thread1, dt);
}
}
}
写:
private void Thread1(object state)
{
var dt = (DataTable)state;
MsSql.Insert(dt);
Console.WriteLine("Write {0}", DateTime.Now.ToString("HH:mm:ss.fff"));
OK_WORK_COUNT++;//已处理任务数+1
//从任务队列移除
if (DataTableList.Count > )
{
DataTableList.TryDequeue(out dt);
}
}
读取MySQL数据库的方法很简单:
MySqlDataAdapter.Fill(DataTable dataTable)方法填充数据。
写入MSSQL数据库的方法也很简单:
SqlBulkCopy.WriteToServer(DataTable dataTable)方法批量插入数据。
经过多次测试,程序上的优化,基本到位了,但我知道肯定还有可以改进的地方,请各路大神不惜赐教。
主要性能瓶颈还是在I/O上,就拿我自己的例子来说吧:
本机上用HHD存放MySQL和MSSQL数据库,不管三七二之一,连同数据迁移程序也放在HHD。
一次读写5000条数据,单线程测试结果是:41分31秒。
本机上创建一个RAM DISK用来存放MySQL和MSSQL数据库,照旧,数据迁移程序也放在这里。
一次读写20W条数据,单线程测试结果:3分11秒
而改为ConcurrentQueue<T>多线程同步线程安全后,一次读写20W条数据,多线程测试结果:2分11秒
如果读写数据不需要按顺序的话,完全可以抛弃掉ConcurrentQueue<T>,从而获得更高的效率,更快的读写速度。
如果SqlBulkCopyOptions不设置为UseInternalTransaction (事务),又可以再快上一点点。
如果写入目标是Oracle数据库,和MSSQL相比,Oracle的平均写入速度比MSSQL要快上0.1~0.35秒。
当然,无论怎样,实际测试数据和我公布的测试数据是有差异的,毕竟使用环境不同。
这个测试结果并不专业,请各位多多见谅。
范例源码:https://gitcandy.com/Repository/Tree/MySQLToMSSQL-MultiThread-Queue-Safey
注释:
FIFO:“先进先出法”是一种排程算法。它描述了一个伫列所使用的先到先得服务方式:先进入伫列的工作将先被完成,之后进来的则必须稍候。
参见英文版维基百科:http://en.wikipedia.org/wiki/FIFO_(computing)
中文版维基百科太简洁了:http://zh.wikipedia.org/zh-cn/先进先出
HHD:全称Hard Disk Drive,详见:硬盘-百度百科
RAM Disk:详见:RAM驱动器-百度百科
MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒的更多相关文章
- MySQL数据迁移那些事儿
前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表.某个库或某个实例.根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题.本篇文章,我们一起来看下 MySQL ...
- mssql与mysql 数据迁移
概要: mssql向mysql迁移的实例,所要用到的工具bcp和load data local infile. 由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql ser ...
- MySQL数据迁移到SQL Server
数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...
- MySQL数据转移至MSSQL详解
一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题. 二.创建系统DS ...
- centos下mysql数据迁移方法
第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...
- MySQL数据迁移问题
最近尝试了一下小型数据迁移.本地迁移,windows平台,修改配置文件中的data_dir项,然后将旧的data文件下的数据文件全部拷贝过去. 之后登陆数据库,竟然1145错误.可以看到数据库的结构, ...
- Mysql 数据迁移后 启动出错
今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...
- .Net5 IdentityServer4下SqlServer和Mysql数据迁移
1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...
- 记一次MySQL数据迁移到SQLServer全过程
为什么要做迁移? 由于系统版本.数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导.开发请示,得到批准后,便有了这次学习的机会,所以特此来记 ...
随机推荐
- [学习笔记] Inten
- [译]WebForms vs. MVC
译者介绍 小小.NET学童,滴答…滴答…的雨…… 正文如下======================================================= 原文示例(VS2012): 1 ...
- ABP理论学习之MVC视图
返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...
- Microsoft Azure Web Sites应用与实践【1】—— 打造你的第一个Microsoft Azure Website
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
- 你真的会用java replaceAll函数吗?
replace.replaceAll.replaceFirst这三个函数会java的同学估计都用过,笔者已经用了2年多,可是,我们真的懂他们吗? 概述一下他们三个的用法: · replace(Char ...
- weblogic配置数据源
启动weblogic 管理服务器,使用管理用户登录weblogic管理控制台 打开管理控制台后,在左侧的树形域结构中,选择服务->数据源. 在右侧的窗口中,选择 新建->一般数据源 ...
- 1代 angularjs ember vue 比较
angularjs ember vue 比较 看了别人的ppt,直接贴结果,仅供参考
- 有关binlog的那点事(二)(mysql5.7.13)
上次,我们仅仅把binlog做了一个概述,并没有去深入探索(1)binlog file究竟是怎么构成的?(2)binlog file的单元binlog events是怎么构成的?(3)我们能不能伪造出 ...
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
- 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现
前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...