DB2相关程序优化建议_第1页
DB2相关程序优化建议_第2页
DB2相关程序优化建议_第3页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DB2 相关程序优化建议程序开发建议? 注意程序锁的使用DB2 有十分严格的锁机制,存在锁升级的概念,锁也需要占用一定的缓 存空间,当程序的行级锁达到一定数量后可升级为表级锁,表锁达到一 定数量后可升级为库级锁,将整个数据库锁住。所以在写程序的时候我 们要十分关注程序锁的使用,尤其是对应并发性高的程序。隔离级别主要用于控制在DB2根据应用提交的SQL语句向DB2数据库中 的相应对象加锁时, 会锁住哪些纪录, 也就是锁定的范围。 隔离级别 的不同, 锁定的纪录的范围可能会有很大的差别。隔离级别分为RR/RS/CS/UR这四个级别。下面让我们来逐一论述:1. RR隔离级别:在此隔离级别下,DB2会

2、锁住所有相关的纪录。 在 一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应 的锁。具体的锁的类型还是由操作的类型来决定, 如果是读取, 则加共 享锁;如果是更新,则加独占锁。由于会锁定所有为获得 SQL语句的 结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候,索引的 增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫 描的纪录数量。2. RS隔离级别:此隔离级别的要求比RR隔离级别稍弱,此隔离级别下 会锁定所有符合条件的纪录。 不论是读取,还是更新,如果SQL语句 中包含查询条件, 则会对所有符合条件的纪录加相应的锁。 如果没有条 件语句, 也就是对

3、表中的所有记录进行处理,则会对所有的纪录加锁。3. CS隔离级别: 此隔离级别仅锁住当前处理的纪录。4. UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行 级锁。对于非只读的操作,它的锁处理和 CS相同。在这四种隔离级别中,CS是缺省值。 这四种隔离级别均可以保证DB2数据库在并发的环境下不会有数据丢失的情况发生。要注意的是如果对 纪录进行了修改, 需要在相应的纪录上加独占类型的锁, 这些独占类型 的锁直到交易结束时才会被释放, 这一点在四种隔离级别下都是相同的。 到这里, 我们已经对 DB2 中的表锁, 行锁, 隔离级别进行了论述。 DB2 数据库的并发控制主要是通过这些机制。

4、理解了这些概念, 我们就可以 在使用 DB2 数据库时根据系统的实际需要来设计锁模式和隔离级别, 来 实现我们的系统要求, 在保障数据安全的前提下, 提供较好的并发性。 如上针对隔离级别的解释,我们在对大表,尤其是并发性高的大表 进行查询是一定要指定隔离级别,在语句的最后加上 with ur 。? 注意清空表的方式不管是在oracle还是DB2中delete的性能都是较低的,因为delete需要 回归段记录日志,oracle提供了一种全表清空的高效方法trun cate语句, 而在 DB2 中没有同样的语句, DB2 也提供了一种快速清空表的方式, 这 种方式在建表时需要加一个属性,如下:CR

5、EATE TABLE DB_PRM.BRAND (BRAND_ID BIGINT NOT NULL,BRAND_NAME VARCHAR( 200 ),BRAND_STATE VARCHAR( 3),BRAND_DESC VARCHAR( 250 ),EFF_DATE TIMESTAMP ,EXP_DATE TIMESTAMP ,BRAND_FLAG CHARACTER( 1),PARENT_ID BIGINT)IN PRM_TBS_32not logged initiallyPARTITIONING KEY ( BRAND_ID ) USING HASHING;然后在清空表时使用如下语句:

6、alter table name activate not logged initially with empty table? Sql 的编写原则DB2 的 sql 编写规则和 oracle 有所不同, oracle 不管是在写程序还是存 储过程中尽量是化繁为简,将复杂的 sql 语句尽量拆开,分成多条 sql 进行处理,可以有效的提高程序的运行效率。而在 DB2 中则恰恰相反,我们在写 sql 的时候尽量将多个 sql 语句写成 一个负责的语句来处理,这样反而效率更高。原因是 DB2 的 sql 解析处理引擎要远好于 oracle ,越是对于复杂的 sql 解析处理的速度优势越明显。反而

7、DB2 的程序写的过程, sql 过多,如 果事务处理不好,容易造成锁升级导致程序跑不出来死住的情况。? 存储过程必要的参数创建存储过程语句( CREATE PROCEDURE )可以包含很多参数,虽 然从语法角度讲它们不是必须 的,但是在创建存储过程时提供它们可以提高执行效率。下面是一些常 用的参数容许 SQL (allowed SQL )子句的值指定了存储过程是否会使用 SQL 语句,如果使用,其类型如何。它的可能值如下所示: NO SQL : 表示存储过程不能够执行任何 SQL 语句。 CONTAINS SQL : 表示存储过程可以执行 SQL 语句, 但不会读取 SQL 数据,也不会修

8、改 SQL 数据。 READS SQL DATA : 表示在存储过程中包含不会修改 SQL 数据 的 SQL 语句。也就是说该储存过程只从数据 库中读取数据。 MODIFIES SQL DATA : 表示存储过程可以执行任何 SQL 语句。 即可以对数据库中的数据进行增加、删除和修改。如果没有明确声明 allowed-SQL ,其默认值是 MODIFIES SQL DATA 不同类型的存储过程执行的效率是不同的,其中NO SQL效率最好,MODIFIES SQL DATA 最差 如果存储过程只是读取数据,但是因为没有声明 allowed-SQL 使其被当作对数据进行修改的存 储过程来执行,这显

9、然会降低程序的执行效率。 因此创建存储过程时, 应当明确声明其 allowed-SQL? 游标使用建议在DB2的游标使用中与oracle有一点十分不同之处,当 Declare一个游 标,然后 open 进行循环取数据时,默认情况如果在每次循环中都需要 commit 事务,则游标会失效,无法取得游标下一个值,如果循环体中没 有事务提交操作,则不会出现如上情况。那如果我们需要每次循环提交事务时该如何处理呢?,需要在 Declare 游标的时候增加一个 with hold 属性,类似语句如下:EXEC SQL DECLARE chnKpiInitCur CURSOR WITH HOLD FORts_

10、chn_kpi_node WHERESELECT group_id,base_flag FROM valid_flag=1 ORDER BY group_id;EXEC SQL OPEN chnKpiInitCur;? 合理使用临时表我们在储存过程开发中经常使用临时表。合理的使用临时表可以简化程 序的编写,提供执行效率, 然而滥用临时表同样也会使得程序运行效率降低。临时表一般在如下情况下使用:1. 临时表用于存储程序运行中的临时数据。例如,如果在一个程序中第 一条查询语句执行的结果会被后续的查询语句用到,那么我们可以把第一次查询的结果存储在一个 临时表中供后续查询语句使用,而不是在后续查询语句

11、中重新查询一次。如果第一条查询语句非常 复杂和耗时,那么上面的策略是非常有效的。2. 临时表可以用于存储在一个程序中需要返回多次的结果集。例如,程 序中有一个很耗资源的多表查询,同时,该查询在程序中需要执行多次,那么就可以把第一次查询 的结果集存储在临时保中,后续的查询只需要查临时表就可以了。3. 临时表也可以用于让SQL访问非关系型数据库。例如,可以编写程序 把非关系型数据库中的数据 插入到一个全局临时表中,那么我们就可以对其数据进行查询。我们可使用 DECLARE GLOBAL TEMPORARY TABLE 语句来定义临 时表。DB2的临时表是基于会话的,且在会话之间是隔离的。当会话结束

12、时,临时表的数据被删除, 临时表被隐式卸下。对临时表的定义不会在 SYSCAT.TABLES 中出现 下面是定义临时表的一个示 例:定义临时表DECLARE GLOBAL TEMPORARY TABLE gbl_tempLIKE personON COMMIT DELETE ROWSNOT LOGGEDIN usr_tbsp此语句创建一个名为 gbl_temp 的用户临时表。定义此用户临时表 所使 用的列的名称和说明与person 的列的名称和说明完全相同。 创建有两个字段的临时表DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP2(ID INTEGER d

13、efault 3,NAME CHAR(30)-WITH REPLACENOT LOGGED;-IN USER_TEMP_01; 此语句创建了一个有两个字段的临时表。理论上临时表是不需要显示 DROP 的,因为它是基于会话的,当临时表 基于的连接关闭的时候,临 时表也就不存在了。但是在实际开发中会有一些情况需要我们对临时表 加以注意。一种情况就是被调用的存储过程的返回值是一个基于临时表的结果集。 当存储过程执行完毕的时候,临时表并不会消失,因为返回的结果集相当于一个指针,指向临时 表所在的内存地址,此时临时表是不会被 DROP 掉的。这种情况下,既不能在存储过程中删除这个 临时表,也不应该由客户

14、应 用显示的删除临时表,这就容易出现一些问题。常用 DB2 命令及解释数据库连接写法db2 connect to stdmdb数据库名称)user用户名using密码 数据库 sqlcode 码解释查找db2cmd进入db2命令模式,打db2进入db2模式针对具体的sqlcode,打? SQLXXXXN 即可打开帮助文档查看具体的sqlcode码解释通过 SQL 获取当前日期,时间,时间戳的方法SELECT current date FROM sysibm.sysdummy1SELECT current time FROM sysibm.sysdummy1SELECT current time

15、stamp FROM sysibm.sysdummy1关于时间的一些计算:current date + 1 YEARcurrent date + 3 YEARS + 2 MONTHS + 15 DAYS current time + 5 HOURS - 3 MINUTES + 10 SECONDSDB2左连接方式的写法(与 oracle 对比)Oracle :select a.* from td_chn_group_msg a,ts_chn_group_status b where a.group_status = b.status_code(+)DB2:select a.* from td_

16、chn_group_msg a left outer join ts_chn_group_status b on (a.group_status = b.status_code)查看锁记录get snapshot for locks on stdmdb (数据库名称) 查看数据库客户端连接信息list application for database stdmdb(数据库名称) show detail查看数据库的配置信息get db cfg for stdmdb(数据库名称 )修改数据库的配置信息db2 update db cfg for stdmdb( 数据库名称 ) using logfi

17、lsiz 6000 具体的配置项,配置项的值 断掉所有的应用程序 force application all 断掉指定的应用程序force application (程序 pid ) 查看所有节点上的表空间使用情况 select substr (TABLESPACE_NAME, 1, 20) as TBSPC_NAME, bigint (TOTAL_PAGES * PAGE_SIZE) / 1024 / 1024 as "TOTAL(MB)",used_pages * PAGE_SIZE / 1024/ 1024 as "USED(MB)", free_

18、pages * PAGE_SIZE / 1024 / 1024 as "FREE(MB)" from table (snapshot_tbs_cfg( 'stdmdb' , - 2) as snapshot_tbs_cfg ; 简单的类型转换函数money为 In teger In teger > charchar( mon ey)char > Integer Integer(trim(char(money)money为 double(8,2) double>char char(cast(m oneyas decimal(8,2)char

19、>doublecast(cast(char(cast(a.money as decimal(8,2) as decimal(8,2) as double) money为 decimal(8,2) decimal>charDigits(m on ey)char >decimal cast(Digits(money) as decimal(8,2)money为 datedate>charchar( mon ey)char >datedate(trim(char(money)money为 bigi ntbigi nt ->charchar( mon ey)char

20、 >bigintcast(char(money) as bigint)SYSCAT.COLUMN包含每一行对应于表或视图中定义的列SYSCAT.INDEXCOLUS包 含每一行包含的所有列SYSCAT.INDEXES包含每一行对应于表或视图中定义的每个索引SYSCAT.TABLES所创建每个表,视图,别名对应其中一行SYSCAT.VIEWS所创建每个视图对应其中一行或几行三、 DB2 性能监控及调优? 统计值更新( runstat)个人认为这类似与 oracle 的表分析 适时更新数据统计信息。- 当向表装入数据并创建了合适的索引时。-当用REORG实用程序重新组织表时。- 当存在大量影

21、响表及其索引的更新、删除和插入操作时。(此处的大量”可能意味着 10% 到20% 的表和索引数据都受到了影响。)绑定性能至关重要的应用程序之前。-当预取数量发生变化时。 只有当进行显式的请求时,对象的统计信息才会在系统目录表中被更 新。更新部分或全部统计信息方法:-使用RUNSTATS (运行统计信息,run statistics )实用程序。使用 “ reorgchkupdate statistics 命令。”在使用 RUNSTATS 之后需要重新绑定使用静态 SQL 的应用程序,使 查询优化器就可以选择新统计信息所给出的最佳存取方案。 但是,对于使用动态 SQL 的应用程序而言,没必要进行重新绑定,因为语句的优化是根据统计信息 在运行时进行的。整库执行的脚步如下:db2 conn ect to DB_NAMEd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论