SQL Server集成服务(SQL Server Integration Services,SSIS)在其前辈DTS(Data Transformation Services,数据转换服务)的根基上进步了不少,从可用性、性能和并行等方面来说,它已经成长为一个企业级ETL(Extraction, Transformation and Loading,抽取、转换和加载)产品,除了是一个ETL产品外,它也供给了各种内置任务来管理SQL Server实例。虽然SSIS的内部架构已经被设计为供给极好的性能和并行处理能力,但如果遵守最佳实践,其性能还可进一步优化,在本系列文章中,我将讨论SSIS的最佳实践,我会将我过去几年学习和应用SSIS的经验与大家分享

  正如上面所说的,SSIS是DTS(SQL Server 7/2000)的替代产品,如果你曾经应用过DTS,你会发现SSIS包和DTS包非常类似,但本色上已经发生了很大的变更,SSIS不是DTS的增强版本,而是从零开始构建的一个新产品,与DTS相比,SSIS供给了更好的性能和并行处理能力,并克服了DTS的许多限制。

  SSIS 2008进一步增强了内部数据流管道引擎,供给了更好的性能,你可能已经看到了SSIS 2008创造的一个ETL世界记载,那就是在半小时内加载1TB数据。

  SSIS的最大好处是它是SQL Server的一个组件,它可以随SQL Server安装而免费获得,不再需要为它购买额外的许可,BI开发人员、数据库开发人员和DBA都可以应用它转换数据。

  最佳实践1:抽取大宗量数据

  最近我们从一个有3亿条记载的大表中抽取数据,起初,当SSIS包启动时一切正常,数据如预期的那样在转换,但性能开始逐渐下降,数据转换速率直线下降。通过分析,我们发现目标表有一个主聚集键和两个非聚集键,因为大量数据插入这个表,导致其索引碎片水平达到了85%-90%。我们应用索引在线重建特征重建/重组索引,但在加载期间,每过15-20分钟,索引碎片水平又回到90%,最终数据转换和并行履行的在线索引重建历程花了12-13个小时,远远越过了我们的预期。

  我们想出了一个办法,,当转换开始前,我们将目标表的索引整个删掉,转换收场后又再重新创建索引,通过这样处理后,全部转换历程花了3-4小时,完全符合我们的预期。

  全部历程我画在下面的图中了。因此我建议如果可能,在插入数据前,删掉目标表上的所有索引,特别是插入大数据量时。

转换数据前,删除目标表上的所有索引,转换完后,再重建索引

  最佳实践2:避免应用select *

  SSIS的数据流任务(Data Flow Task,DFT)应用一个缓冲区作为数据传输和转换的中转站,当数据从源表传输到目标表时,数据首先进入缓冲区,数据转换是在缓冲区中完成的,转换完毕后才会写入到目标表中。

  缓冲区的大小受服务器硬件本身限制,它要估算行的大小,行大小是通过一行中所有列大小的最大值求和得出的,因此列数越多,意味着进入缓冲区的行就会越少,对缓冲区的需求就会越多,性能就会下降。因此转换时最好明确指定需要转换到目标表的列。即使你需要源表中的所有列,你也应该在select语句中明确指定列的名称,如果你应用select *,它会绕到源表收集列的元数据,SQL语句履行光阴自然就会长一些。

  如果你将目标表不需要的列也做了转换,SSIS将会弹出警告提示信息,如:

Code highlighting produced by Actipro CodeHighlighter (freeware)
-->  [SSIS.Pipeline] Warning: The output column "SalariedFlag" (64) on output "OLE DB Source Output" (11) and component "OLE DB Source" (1) is not subsequently used in the Data Flow task.
  Removing this unused output column can increase Data Flow task performance.
  [SSIS.Pipeline] Warning: The output column "CurrentFlag" (73) on output "OLE DB Source Output" (11) and component "OLE DB Source" (1) is not subsequently used in the Data Flow task.
  Removing this unused output column can increase Data Flow task performance.

  当你在OLEDB源中应用“表或视图”或“来自变量的表名或视图名”数据造访模式时要小心,它的行为和select *一样,都会将所有列进行转换,当你确凿需要将源表中的所有列整个转换到目标表中时,你可以应用这种法子。

  最佳实践3:OLEDB目标设置的影响

  下面是一组会影响数据转换性能的OLEDB目标设置:

  数据造访模式:这个设置供给“快速载入”选项,它应用BULK INSERT语句将数据写入目标表中,而不是简单地应用INSERT语句(每次插入一行),因此,除非你有特殊需求,否则不要更改这个快速载入默认选项。

  维持一致性:默认设置是不会反省的,这意味着目标表(如果它有一个标识列)将会创建自己的标识值,如果你反省这个设置,数据流引擎将会确保源标识值受到保护,会向目标表插入相同的值。

  维持空值:默认设置也是不会反省的,这意味着来自源表中的空值将会插入到目标表中。

  表锁:默认设置是要反省的,建议维持默认设置,除非是同一时刻还有其它进程应用同一个表,指定一个表锁将会取得全部表的造访权,而不是表中多行的造访权,这很可能会引发连锁反应。

  反省约束:默认设置是要反省的,如果你能确保写入的数据不会违反目标表上的约束,建议不要反省,这个设置会指定数据流管道引擎验证写入到目标表的数据,如果不反省约束,性能会有很大提升,因为省去了反省的开销。

  最佳实践4:每批插入的行数以及最大插入大小设置的影响

  每批插入的行数:这个设置的默认值是-1,意味着每个输入行都被看做是一个批次,你可以改变这个默认行为,将所有行分成多个批次插入,值只允许正整数,它指定每一批次包孕的最大行数。

  最大插入提交大小:这个设置的默认值是“2147483647”,它指定一次提交的最大行数,你可以改动这个值,注意,如果这个值设得太小,会导致提交次数增加,但这样会释放事务日志和tempdb的压力,因为大宗量插入数据时,对事务日志和tempdb的压力是非常大的。

  上面两个设置对于理解改良tempdb和事务日志的性能是非常首要的,例如,如果你维持最大插入提交大小的默认值,在抽取期间事务日志和tempdb会不断变大,如果你传输大宗量数据,内存很快就会消费光,抽取就会失败,因此最好基于你自身的环境为其设置一个合理的值。

  注意:上面的建议得益于我多年的DTS和SSIS应用经验,但如前所示,还有其它因素影响性能,如根基设施和网络环境,因此,当你将这些措施推向生产环境之前,最好做一次彻底的测试

SQL Server集成服务最佳实践:语句优化的更多相关文章

  1. 【译】索引进阶(十七): SQL SERVER索引最佳实践

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章我们给出一些建议:贯穿本系列我们提取出了十四条基本指南,这些基本的指南将会帮助你为你的数据库创建最佳的索引 ...

  2. SQL Server SA 最佳实践(也许不仅仅是翻译)

    老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...

  3. SQL Server CDC最佳实践

    企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载.于是 ...

  4. 清除系统日志及数据库(sql server)日志最佳实践

    在一个项目中遇到的问题:系统日志过大,后来用delete语句删除了(相当的慢),结果数据库日志又变成很大了(差不多10G),所以又得把数据库日志删除. 方法: --备份系统中的部份日志--SELECT ...

  5. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  6. Sql Server CPU 性能排查及优化的相关 Sql

    Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...

  7. SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

    最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN ...

  8. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  9. SQL Server Profiler监控执行语句

    SQL Server Profiler监控执行语句,这个功能主要用在实时的监控对数据库执行了什么操作,从而及时有效的跟踪系统的运行. 常规配置选项,名称.模板.保存到文件(可以复用). 事件选择,可以 ...

随机推荐

  1. Testlink安装:Notice:Undefined index: type in C:\inetpub\wwwroot\testlink-1.9.3\install\installCheck.php on line 41

    问题现象:

  2. Vue表格中时间的处理

    Vue中表格的数据应该来自后台数据库,然后从数据库中读取到的数据,时间格式可能有些不同,我们可以根据实际需要来对这个时间进行转化. 这里介绍一个js库,它提供了强大的日期处理功能,功能强大且只有2k大 ...

  3. ThinkPHP在入口文件中判断是手机还是PC端访问网站

    <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...

  4. Java语言实现简单FTP软件------>FTP协议分析(一)

    FTP(File Transfer Protocol)就是文件传输协议.通过FTP客户端从远程FTP服务器上拷贝文件到本地计算机称为下载,将本地计算机上的文件复制到远程FTP服务器上称为上传,上传和下 ...

  5. 004-搭建框架-实现AOP机制【一】代理技术

    前景提要 监控方法性能.执行时间.记录日志等 AOP( Aspect Oriented Programming)面向方面编程. 在AOP中,需要定义一个Aspect(切面)类来编写需要横切业务的逻辑代 ...

  6. MongoDB学习笔记—常用命令

    这里记录一下MongoDB常用的命令 数据库相关 创建数据库 use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 删除数据库:切换到要删除的数据库下,执行命令即 ...

  7. 5 Best VPNs for Ubuntu

    https://www.bestvpn.com/blog/6268/5-best-vpns-for-ubuntu/?nabe=6412130213429248:0&utm_referrer=h ...

  8. activiti部署到linux后流程图不显示汉字的问题

    linux和windows的字体文件一般是不一样的,默认情况下,linux的java7中一般不支持中文,activiti的动态流程图中的汉字需要java调用汉字的字库,这里需要配置一下java的汉字字 ...

  9. windows 和rhel,centos双系统安装

    1:首先确保你先安装为windows系统,为indows7以上的把. 2:安装好为indows系统后,进入系统后把磁盘分区,分出足够的空间为安装linux. 3:再为windows下使用软碟通等工具制 ...

  10. vimium的使用介绍和基本用法

    vimium是chrome浏览器的一个插件,fq去chrome应用商店搜索vimium,下载安装 纯键盘操作,脱离了鼠标,提高效率 核心是f,安装好vimium后只需要按f,输入对应的编号就能进入相应 ...