作为DBA,时不时会遇到将数据导入到数据库的情况,假设业务或研发提供一个包含上百万行INSERT语句的脚本文件,而且这些INSERT 语句没有使用GO来进行批处理拆分,那么直接使用SQLCMD来执行会发现该进程消耗大量物理内存并迟迟没有数据写入,即使脚本中每一行都添加了GO,你依然会发现这插入效率太差,让你无法忍受,怎么搞呢,下面小代码帮你折腾下:

$old_file_path= 'C:\SQL001.TXT'
$new_file_path='C:\SQL001_New'
$tran_rows=10
$file_rows=30
$current_file_id=0 $line_num=0
$sr1=[IO.StreamReader]$old_file_path
$line_content=""
$row_content=""
while(-not $sr1.EndOfStream)
{
if(($line_num%$file_rows) -eq 0)
{
$current_file_id=[int]$current_file_id+1
$current_file_path = $new_file_path+"_"+$current_file_id
$line_content=""
$line_content |Out-File $current_file_path
} if(($line_num%$tran_rows) -eq 0)
{
$line_content="
SET NOCOUNT ON
GO
BEGIN TRAN
BEGIN TRY
"
$line_content |Out-File -Append $current_file_path
$line_content=""
}
$tmp_content=$sr1.ReadLine()
$row_content=$row_content+"`r"+$tmp_content $line_num=$line_num+1 if((($line_num%$tran_rows) -eq 0) -or ($sr1.EndOfStream))
{
$row_content | Out-File -Append $current_file_path
$row_content=""
$batch_first_line=([int](($line_num+1)/$tran_rows-1))*$tran_rows+1
$line_content="
COMMIT
--PRINT '执行第"+($batch_first_line)+"行到第"+($line_num)+"行成功'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '执行第"+($batch_first_line)+"行到第"+($line_num)+"行失败'
END CATCH
GO
"
$line_content | Out-File -Append $current_file_path
Write-Host "处理到行" $line_num
} } $sr1.Close()

2016年11月2日进行了下优化,当单个文件包含过多行时,会很难编辑处理,增加了按照行数拆分成文件的功能,同时优化下代码的可读性。

还是看点疗效吧,原始SQL为:

经过此脚本修改过的变为:

这样实现有以下有点:

1.  使用“SET NOCOUNT ON”来屏蔽每条语句返回影响行数,减少与cmd窗口交互的次数;

2.  将每50条语句拆分到一个批处理中,降低数据库进行语法检查分析的消耗,在封装到一个事务中进行提交,减少写日志的次数;

3.  打印输出事务执行结果,方便排查错误(可修改代码只输出执行失败的事务)

执行结果截图:

====================================================

在个人电脑测试,以100条一个事务来拆分,大概1分钟可以导入50万到60万,按不同的行数进行拆分插入效率不同,具体合适的拆分行数需要根据实际情况测试为准。

对于超大数据量的导入,还是推荐使用csv+bcp的方式来导入,INSERT+SQLCMD的效率始终太低太低!

====================================================

没啥技术含量,厚脸拿出来分享,只是因为很久没写博客啦!

Powershell--批量拆分SQL语句为事务并批处理的更多相关文章

  1. 带参方法的执行:普通方法的查询,可为空方法的查询。批量处理SQL语句。

    普通方法的查询: @Override public List<Map<String, Object>> selectSpentAmount(Integer MAT_TYPE_, ...

  2. SQL*PLUS中批量执行SQL语句

    SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...

  3. 批量执行sql语句

    基本使用 $sqls="sql语句1;sql语句2;sql语句n"; 或 $sqls="insert into xx;";  $sqls.="inse ...

  4. c#实现用SQL池(多线程),定时批量执行SQL语句 【转】

    在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈.面对这问题, ...

  5. PHP mysqli 增强 批量执行sql 语句的实现代码

    本篇文章介绍了,在PHP中 mysqli 增强 批量执行sql 语句的实现代码.需要的朋友参考下. mysqli 增强-批量执行sql 语句 <?php //mysqli 增强-批量执行sql ...

  6. c#实现用SQL池(多线程),定时批量执行SQL语句

    在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈.面对这问题, ...

  7. mysqli扩展库应用---批量执行sql语句

    1, mysqli批量执行sql语句.基本语法: $sqls=”sql1;sql2;………” mysqli::multi_query($sqls); 同一个$sqls要么是增删改语句集合,要么是查询语 ...

  8. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...

  9. 批量生成sql语句,难得

    在工作我们常常要批量生成sql文件,因为业务部门经常给我们的是excel文件,根据我的经验,推荐两种批量生成sql文件方式 1.excel批量生成sql ,sql语句如下 INSERT INTO Ta ...

随机推荐

  1. 自己实现atoi的功能

    整理思路: #include <stdio.h> int len(const char *s) { ; while (s[len]) { len++; } return len; } in ...

  2. cassandra的写过程

    如下: Message, get a new request,type:QUERY      //channelRead0函数 Message, get a new request,customPay ...

  3. c# udp局域网通信

    udp224.0.0.1 子网上的所有系统224.0.0.2 子网上的所有路由器224.0.0.12 dhcp服务器224.0.1.1 ntp224.0.1.24 wins服务器 http://www ...

  4. JAVA求圆的面积

    import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...

  5. eclipse开发 javafx(转)

    了解过JavaFX的都知道,JavaFX自从2.0版本开始,已经完全抛弃了之前的script语言,才用纯java来实现.这样的好处就是1.让使用Java的IDE进行JavaFX的开发成为可能,2.Ja ...

  6. doxygen的使用(一)配置并生成文档

    原创文章,欢迎阅读,禁止转载. doxygen是个好用的文档生成工具,他的强大功能有很多介绍,我就不说了.自带的chm帮助手册很全面,包括功能.注释规范.怎么配置.工具用法等.doxygen的用法共3 ...

  7. Python发布包到Pypi

    本地打包:python setup.py sdist 上传Pypi:python setup.py register sdist upload

  8. scrapy-1.2.1安装失败之解决方法

    前几天重装了win10 64位系统,安装了python-3.5,但是用pip安装scrapy模块时出现如下错误: 看起来是lxml安装的时候出错了,于是先pip install lxml,出现了和上面 ...

  9. 搜索引擎 ElasticSearch 之 步步为营1 【环境搭建&初识ElasticSearch】

    1.下载ElasticSearch a.下载Java环境JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...

  10. Kickstart/Anaconda实现自动化安装原理探究

    原网页地址:http://molinux.blog.51cto.com/2536040/548247#55918... 内容概要:  1.  系统安装基本流程图示2.  Anaconda简介3.  K ...