DB2相关程序优化建议

上传人:gg****m 文档编号:213903439 上传时间:2021-11-22 格式:DOCX 页数:7 大小:63.76KB
返回 下载 相关 举报
DB2相关程序优化建议_第1页
第1页 / 共7页
DB2相关程序优化建议_第2页
第2页 / 共7页
DB2相关程序优化建议_第3页
第3页 / 共7页
DB2相关程序优化建议_第4页
第4页 / 共7页
DB2相关程序优化建议_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《DB2相关程序优化建议》由会员分享,可在线阅读,更多相关《DB2相关程序优化建议(7页珍藏版)》请在金锄头文库上搜索。

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 数据库的并发控制主要是通过这些机制。理解了这些概念,我们就可以 在使用DB2数据库时根据系统的实际

4、需要来设计锁模式和隔离级别,来 实现我们的系统要求,在保障数据安全的前提下,提供较好的并发性。如上针对隔离级别的解释,我们在对大表,尤其是并发性高的大表 进行查询是一定要指定隔离级别,在语句的最后加上with uro注意清空表的方式不管是在oracle还是DB2中delete的性能都是较低的,因为delete需要 回归段记录H志,oracle提供了一种全表清空的高效方法truncate语句, 而在DB2中没有同样的语句,DB2也提供了一种快速清空表的方式,这 种方式在建表时需要加一个属性,如下:CREATE TABLE DB_PRM.BRAND (BRAND_ID BIGINT NOT NUL

5、L,BRAND_NAME VARCHAR(200),BRAND_STATE VARCHAR(3),BRAND_DESC VARCHAR(250),EFF_DATE TIMESTAMP,EXP_DATE TIMESTAMP,BRAND_FLAG CHARACTER(1),PARENTDBIGINT)IN PRM_TBS_32not logged initiallyPARTITIONING KEY ( BRAND_ID ) USING HASHING;然后在清空表时使用如下语句;alter table name activate not logged initially with empty ta

6、ble Sql的编写原则DB2的sql编写规则和oracle有所不同,oracle不管是在写程序还是存 储过程中尽量是化繁为简,将复杂的sql语句尽量拆开,分成多条sql 进行处理,可以有效的提高程序的运行效率。而在DB2中则恰恰相反,我们在写sql的时候尽量将多个sql语句写成 一个负责的语句来处理,这样反而效率更高。原因是DB2的sql解析处理引擎要远好于oracle,越是对于复杂的sql 解析处理的速度优势越明显。反而DB2的程序写的过程,sql过多,如 果事务处理不好,容易造成锁升级导致程序跑不岀来死住的情况。存储过程必要的参数创建存储过程语句(CREATE PROCEDURE)可以包

7、含很多参数,虽 然从语法角度讲它们不是必须的,但是在创建存储过程时提供它们可以提高执行效率。下面是一些常 用的参数容许SQL (allowed-SQL)子句的值指定了存储过程是否会使用SQL 语句,如果使用,其类型如何。它的可能值如下所示: NO SQL:表示存储过程不能够执行任何SQL语句。 CONTAINS SQL:表示存储过程可以执行SQL语句,但不会读取 SQL数据,也不会修改SQL数据。 READS SQL DATA:表示在存储过程中包含不会修改SQL数据 的SQL语句。也就是说该储存过程只从数据库中读取数据。 MODIFIES SQL DATA:表示存储过程可以执行任何SQL语句。

8、即可以对数据库中的数据进行增加、删除和修改。如果没有明确声明allowed-SQL,其默认值是MODIFIES SQL DATA。 不同类型的存储过程执行的效率是不同的,其中NO SQL效率最MODIFIES SQL DATA最差。如果存储过程只是读取数据,但是因为没有声明allowed-SQL使其被当作对数据进行修改的存 储过程来执行,这显然会降低程序的执行效率。因此创建存储过程时,应当明确声明其allowed-SQLo游标使用建议在DB2的游标使用中与oracle有一点十分不同之处,当Declare 一个游 标,然后open进行循环取数据时,默认情况如果在每次循环中都需要 comm让事务,

9、则游标会失效,无法取得游标下一个值,如果循环体中没 有事务提交操作,则不会出现如上情况。那如果我们需要每次循环提交事务时该如何处理呢?,需要在Declare 游标的时候增加一个with hold属性,类似语句如下:EXEC SQL DECLARE chnKpilnitCur CURSOR WITH HOLD FORSELECT group_id,base_flag FROM ts_chn_kpi_node WHERE valid_flag=l ORDER BY group_id;EXEC SQL OPEN chnKpilnitCur;合理使用临时表我们在储存过程开发中经常使用临时表。合理的使用

10、临时表可以简化程 序的编写,提供执行效率,然而滥用临时表同样也会使得程序运行效率降低。临时表一般在如下情况下使用:1 临时表用于存储程序运行中的临时数据。例如,如果在一个程序中第 一条查询语句执行的结果会被后续的查询语句用到,那么我们可以把第一次查询的结果存储在一个 临时表中供后续查询语句使用,而不是在后续查询语句中重新查询一次。如果第一条查询语句非常 复杂和耗吋,那么上面的策略是非常有效的。2临时表可以用于存储在一个程序中需要返回多次的结果集。例如,程 序中有一个很耗资源的多表查询,同时,该查询在程序中需要执行多次,那么就可以把第一次查询 的结果集存储在临时保中,后续的查询只需要查临吋表就可

11、以了。3临时表也可以用于让SQL访问非关系型数据库。例如,可以编写程序 把菲关系型数据库中的数据插入到一个全局临时表中,那么我们就可以对其数据进行查询。我们可使用DECLARE GLOBAL TEMPORARY TABLE语句来定义临 时表。DB2的临时表是基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除, 临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现下面是定义临吋表的一个示 例:定义临时表DECLARE GLOBAL TEMPORARY TABLE gbl_tempLIKE personON COMMIT DELETE ROWSNOT LOGGED

12、IN usr_tbsp此语句创建一个名为gbljemp的用户临时表。定义此用户临时表 所使 用的列的名称和说明与person的列的名称和说明完全相同。 创建有两个字段的临时表DECLARE GLOBAL TEMPORARY TABLE SESSIONTEMP2(ID INTEGER default 3,NAME CHAR(30)-WITH REPLACENOT LOGGED;-IN USER_TEMP_01;此语句创建了一个有两个字段的临吋表。理论上临时表是不需要显示DROP的,因为它是基于会话的,当临时表 基于的连接关闭的时候,临时表也就不存在了。但是在实际开发中会有一些情况需耍我们对临时表

13、 加以注意。一种情况就是被调用的存储过程的返回值是一个基于临时表的结果集。 当存储过程执行完毕的时候,临时表并不会消失,因为返回的结果集相当于一个指针,指向临时 表所在的内存地址,此时临时表是不会被DROP掉的。这种情况下,既不能在存储过程中删除这个 临时表,也不应该由客户应用显示的删除临吋表,这就容易出现一些问题。二、常用DB2命令及解释数据库连接写法db2 connect to stdmdb(数据库名称)user用户名using密码 数据库sqlcode码解释查找db2cmd进入db2命令模式,打db2进入db2模式 针对具体的sqlcode,打? SQLXXXXN即可打开帮助文档 查看具

14、体的sqlcode码解释通过SQL获取当前口期,时间,时间戳的方法SELECT current date FROM sysibm. sysdummylSELECT current time FROM sysibm. sysdummylSELECT current timestamp FROM sysibm sysdummyl关于时间的一些计算:current date + 1 YEARcurrent date + 3 YEARS + 2 MONTHS + 15 DAYScurrent time + 5 HOURS - 3 MINUTES + 10 SECONDSDB2左连接方式的写法(与ora

15、cle对比)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 chn_group_msg a left outer join ts_chn_group_status b on (d. group_stalus 二 b. steitus_code)查看锁记录get snapshot for locks on stdmdb (数据库名称)查看数据库客户端连接信息list appl i cat ion for database stdmdb (数据库名称)show detai 1 查看数据库的配置信息get db cfg for stdmdb (数据库名称)修改数据库的配置信息db2 update db cfg for stdmdb(数据库名称)using logfilsiz 6000 具体的配置项,配置项的值断掉所有的应用程序force application all断掉指定的应用程序 force application (程序 pid)查看所有节点上的表

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号