怎样在DB2中提高Insert性能的技巧(一)

 
   | |

导读:本文概述了INSERT处理过程、insert的替代方案以及从游标装载等方面的内容。

关键词:DB2 DB2性能调整 提高Insert性能

正在加载数据...

  INSERT处理过程概述

  首先让我们快速地看看insert一行时的处理步骤。这些步骤中的每一步都有优化的潜力,对此我们在后面会一一讨论。

  1、在客户机准备语句。对于动态SQL,在语句执行前就要做这一步,此处的性能是很重要的;对于静态SQL,这一步的性能实际上关系不大,因为语句的准备是事先完成的。

  2、在客户机,将要插入的行的各个列值组装起来,发送到DB2服务器

  3、DB2服务器确定将这一行插入到哪一页中。

  4、DB2在用于该页的缓冲池中预留一个位置。如果DB2选定的是一个已有的页,那么就需要读磁盘;如果使用一个新页,则要在表空间(如果是SMS,也就是系统管理存储的表空间)中为该页物理地分配空间。插入了新行的每一页最后都要从缓冲池写入到磁盘

  5、在目标页中对该行进行格式化,并获得该行上的一个X(exclusive,独占的)行锁。

  6、将反映该insert的一条记录写入到日志缓冲区中。

  7、最后提交包含该insert的事务,如果这时日志缓冲区中的记录还没有被写入日志文件的话,则将这些记录写到日志文件中。

  此外,还可能发生很多类型的附加处理,这取决于数据库配置,例如,索引或触发器的存在。这种额外的处理对于性能来说也是意义重大的,我们在后面会讨论到。

   insert的替代方案

   在详细讨论insert的优化之前,让我们先考虑一下insert的两种替代方案:load和import。import实用程序实际上是SQLINSERT的一个前端,但它的某些功能对于您来说也是有用的。load也有一些有用的额外功能,但是我们使用load而不使用insert的主要原因是可以提高性能。

  load直接格式化数据页,而避免了由于插入导致的对每一行进行处理的大部分开销(例如,日志记录在这里实际上是消除了)。而且,load可以更好地利用多处理器机器上的并行性。在V8load中有两个新功能,它们对于load成为insert的替代方案有着特别的功效,这两个功能是:从游标装载和从调用层接口(CLI)应用程序装载。

  从游标装载

  这种方法可用于应用程序的程序代码(通过db2LoadAPI),或用于DB2脚本。下面是后一种情况的一个例子:

  declarestaffcursorcursorforselect*fromstaff;

  loadfromstaffcursorofcursorinsertintomyschema.new_staff;

  这两行可以用下面一行替代:

  insertintomyschema.new_staffselect*fromstaff

  同等效的INSERT...SELECT语句相比,从游标装载几乎可以提高20%的性能。

  从CLI装载

  这种方法显然只限于调用层接口(CLI)应用程序,但是它非常快。这种技巧非常类似于数组插入,DB2附带了这样的示例,使用load时的速度是使用经过完全优化的数组插入时的两倍,几乎要比未经优化的数组插入快10倍。

  所有insert可以改进的地方

  让我们看看插入处理的一些必要步骤,以及我们可以用来优化这些步骤的技巧。

  1.语句准备

  作为一条SQL语句,INSERT语句在执行之前必须由DB2进行编译。这一步骤可以自动发生(例如在CLP中,或者在一次CLISQLExecDirect调用中),也可以显式地进行(例如,通过一条SQLPrepare、CLISQLPrepare或JDBCprepareStatement语句)。该编译过程牵涉到授权检查、优化,以及将语句转化为可执行格式时所需的其他一些活动。在编译语句时,语句的访问计划被存储在包缓存中。

   如果重复地执行相同的INSERT语句,则该语句的访问计划(通常)会进入到包缓存中,这样就免除了编译的开销。然而,如果insert语句对于每一行有不同的值,那么每一条语句都将被看成是惟一的,必须单独地进行编译。因此,将像下面这样的重复语句:

  insertintomytablevalues(1,'abc')
  insertintomytablevalues(2,'def')

  等等,

  换成带有参数标记的语句,一次准备,重复执行,这样做是十分可取的:

  insertintomytablevalues(?,?)

  使用参数标记可以让一系列的insert的运行速度提高数倍。(在静态SQL程序中使用主机变量也可以获得类似的好处。)

  2.发送列值到服务器

  可以归为这一类的优化技巧有好几种。最重要的一种技巧是在每条insert语句中包括多行,这样就可以避免对于每一行都进行客户机-服务器通信,同时也减少了DB2开销。可用于多行插入的技巧有:

  在VALUES子句中包含多行的内容。例如,下面的语句将插入三行:INSERTINTOmytableVALUES(1,'abc'),(2,'def'),(3,'ghi')

  在CLI中使用数组插入(arrayinsert)。这需要准备一条带参数标记的INSERT语句,定义一个用于存储要插入的值的数组,将该数组绑定到参数标记,以及对于每个数组中的一组内容执行一次insert。而且,示例程序sqllib/samples/cli/tbload.c提供了数组插入的基本框架(但是执行的是CLILOAD)。从不使用数组改为使用包含100行的数组,可以将时间缩短大约2.5倍。所以应该尽可能地使用包含至少100行的数组。

  在JDBC中使用批处理操作。这跟CLI中的数组插入一样,基于相同的概念,但是实现细节有所不同。当通过prepareStatement方法准备了insert语句之后,剩下的步骤是针对每一列调用适当的setXXXX方法(例如,setString或setInt),然后是addBatch。对于要插入的每一行,都要重复这些步骤,然后调用executeBatch来执行插入。要查看这方面的例子,请参阅“参考资料”一节中的JDBCTutorial。

  使用load将数据快速地装入到一个staging表中,然后使用INSERT...SELECT填充主表。(通过这种方法节省下来的代价源于load的速度非常快,再加上INSERT...SELECT是在DB2内(在服务器上)传输数据的,从而消除了通信上的代价。一般情况下我们不会使用这种方法,除非在INSERT...SELECT中还要另外做load无法完成的处理。

  如果不可能在一条insert语句中传递多行,那么最好是将多条insert语句组成一组,将它们一起从客户机传递到服务器。(不过,这意味着每条insert都包含不同的值,都需要准备,因而其性能实际上要比使用参数标记情况下的性能更差一些。)将多条语句组合成一条语句可以通过CompoundSQL来实现:

  在SQL中,复合语句是通过BEGINATOMIC或BEGINCOMPOUND语句创建的。

  在CLI中,复合语句可以通过SQLExecDirect和SQLExecute调用来建立。对于DB2V8FixPak4,另一种生成复合语句的方法是在(对一条预处理语句)发出多个SQLExecute调用之前设置语句属性SQL_ATTR_CHAINING_BEGIN,并在调用之后设置语句属性SQL_ATTR_CHAINING_END。


怎样在DB2中提高Insert性能的技巧
 怎样在DB2中提高Insert性能的技巧(一)
 怎样在DB2中提高Insert性能的技巧(二)
 怎样在DB2中提高Insert性能的技巧(三)

原文出处:http://www.qqread.com/db2/e457939.html
 
来源:QQRead    
 
 
 
 
 

DB2性能与调优

 
在许多XML应用场合,XML数据的结构与使用率都决定了拆分工作的困难。这也就是为什么DB2支持XML列,使得用户无需转换就可以对XML数据进行索引与查询。
 
DB2 9 for z/OS 同DB2 9.x for Linux, UNIX, and Windows支持两种拆分方法,XML TABLE函数与XML Schema注释。
 
在9月23日IBM DB2诞生25周年纪念大会上,IBM正式宣布启动寻找XML超级明星的全球比赛,旨在测试参赛者对XML相关知识和技能以及数据库技术的掌握情况。

热门技术手册排行

 

在本次的技术手册中,我们为您提供了PL/SQL的基础知识以及专家指导,包括了PL/SQL中的数据类型简介、PL/SQL函数与触发器以及PL/SQL中的存储过程等,相信您无论是高手还是菜鸟都可以获得有帮助的信息。

 

本系列文章由三部分组成,为Oracle数据库管理员(DBA)面试成功的必备手册。本专题内容囊括从DBA最初的面试开始,从写“杀手简历”到求职信、到面试过程到Oracle认证再到上升到公司高层最后到你成为公司里的明星DBA。专家为你一一指点迷津,最终让你登上成功的宝座。

 

要成为一名DBA,你需要具备哪些素质?DBA的薪酬待遇如何?DBA的职业道路究竟可以走向何方?我们将在本次的技术手册中为您一一解答。

 

在本次技术手册中,我们将对SQL Server存储过程的调试进行详细的介绍,包括了基础的调试方法和在调试过程中出现的T-SQL性能问题和解决方法。

 

本技术专题主要围绕sql server设计这个话题展开,侧重介绍了sql server集簇索引的设计、如何创建sql server索引、如何优化索引、索引的能与不能、处理sql server 2000索引碎片技巧以及维护sql server索引以实现查询优化等等。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录