已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DB2编程序技巧1 DB2编程 1.1 建存储过程时CREATE后一定不要用TAB键 3 1.2 使用临时表 3 1.3 从数据表中取指定前几条记录 3 1.4 游标的使用 4 注意commit和rollback 4 游标的两种定义方式 4 修改游标的当前记录的方法 5 1.5 类似DECODE的转码操作 5 1.6 类似CHARINDEX查找字符在字串中的位置 5 1.7 类似DATEDIF计算两个日期的相差天数 5 1.8 写UDF的例子 5 1.9 创建含IDENTITY值(即自动生成的ID)的表 6 1.10 预防字段空值的处理 6 1.11 取得处理的记录数 6 1.12 从存储过程返回结果集(游标)的用法 6 1.13 类型转换函数 8 1.14 存储过程的互相调用 8 1.15 C存储过程参数注意 8 1.16 存储过程FENCE及UNFENCE 8 1.17 SP错误处理用法 9 1.18 IMPORT用法 9 1.19 VALUES的使用 9 1.20 给SELECT语句指定隔离级别 10 1.21 ATOMIC及NOTATOMIC区别 10 2 DB2编程性能注意 10 2.1 大数据的导表 10 2.2 SQL语句尽量写复杂SQL 10 2.3 SQLSP及CSP的选择 10 2.4 查询的优化(HASH及RR_TO_RS) 11 2.5 避免使用COUNT(*)及EXISTS的方法 11 3 DB2表及SP管理 12 3.1 看存储过程文本 12 3.2 看表结构 12 3.3 查看各表对SP的影响(被哪些SP使用) 12 3.4 查看SP使用了哪些表 12 3.5 查看FUNCTION被哪些SP使用 12 3.6 修改表结构 12 4 DB2系统管理 13 4.1 DB2安装 13 4.2 创建DATABASE 14 4.3 手工做数据库远程(别名)配置 14 4.4 停止启动数据库实例 14 4.5 连接数据库及看当前连接数据库 14 4.6 停止启动数据库HEAD 15 4.7 查看及停止数据库当前的应用程序 15 4.8 查看本INSTANCE下有哪些DATABASE 15 4.9 查看及更改数据库HEAD的配置 16 4.9.1 改排序堆的大小 16 4.9.2 改事物日志的大小 16 4.9.3 出现程序堆内存不足时修改程序堆内存大小 16 4.10 查看及更改数据库实例的配置 16 4.10.1 打开对锁定情况的监控。 16 4.10.2 更改诊断错误捕捉级别 17 4.11 DB2环境变量 17 4.12 DB2命令环境设置 17 4.13 改变隔离级别 17 4.14 管理DBINSTANCE的参数 18 4.15 升级后消除版本问题 18 4.16 查看数据库表的死锁 181 DB2编程 1.1 建存储过程时Create后一定不要用TAB键 create procedure 的create后只能用空格,而不可用tab健,否则编译会通不过。 切记,切记。 1.2 使用临时表 要注意,临时表只能建在usertemporytablesspace上,如果database只有systemtemporytablespace是不能建临时表的。 另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。 建临时表时最好加上withreplace选项,这样就可以不显示的drop临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。 1.3 从数据表中取指定前几条记录 select*fromtb_market_codefetchfirst1rowsonly 但下面这种方式不允许 selectmarket_codeintov_market_code fromtb_market_codefetchfirst1rowsonly; 选第一条记录的字段到一个变量以以下方式代替 declarev_market_codechar(1); declarecursor1cursorforselectmarket_codefromtb_market_code fetchfirst1rowsonlyforupdate; opencursor1; fetchcursor1intov_market_code; closecursor1; 1.4 游标的使用 注意commit和rollback 使用游标时要特别注意如果没有加withhold选项,在Commit和Rollback时,该游标将被关闭。Commit和Rollback有很多东西要注意。特别小心 游标的两种定义方式 一种为 declarecontinuehandlerfornotfound begin setv_notfound=1; end; declarecursor1cursorwithholdforselectmarket_codefromtb_market_code forupdate; opencursor1; setv_notfound=0; fetchcursor1intov_market_code; whilev_notfound=0Do -work setv_notfound=0; fetchcursor1intov_market_code; endwhile; closecursor1; 这种方式使用起来比较复杂,但也比较灵活。特别是可以使用withhold选项。如果循环内有commit或rollback而要保持该cursor不被关闭,只能使用这种方式另一种为 pcursor1:forloopcs1ascousor1cursoras selectmarket_codeasmarket_code fromtb_market_code forupdate do endfor; 这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。 但不能使用withhold选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。 修改游标的当前记录的方法 updatetb_market_codesetmarket_code=0wherecurrentofcursor1; 不过要注意将cursor1定义为可修改的游标 declarecursor1cursorforselectmarket_codefromtb_market_code forupdate; forupdate不能和GROUPBY、DISTINCT、ORDERBY、FORREADONLY及UNION,EXCEPT,orINTERSECT但UNIONALL除外)一起使用。 1.5 类似decode的转码操作 oracle中有一个函数 selectdecode(a1,1,n1,2,n2,n3)aa1from db2没有该函数,但可以用变通的方法 selectcasea1 when1thenn1 when2thenn2 elsen3 endasaa1from 1.6 类似charindex查找字符在字串中的位置 Locate(y,dfdasfay) 查找y在dfdasfay中的位置。 1.7 类似datedif计算两个日期的相差天数 days(date(2001-06-05)?Cdays(date(2001-04-01) days返回的是从0001-01-01开始计算的天数 1.8 写UDF的例子 C写见sqllibsamplescliudfsrv.c 1.9 创建含identity值(即自动生成的ID)的表 建这样的表的写法 CREATETABLEtest (t1SMALLINTNOTNULL GENERATEDALWAYSASIDENTITY (STARTWITH500,INCREMENTBY1), t2CHAR(1); 在一个表中只允许有一个identity的column.1.10 预防字段空值的处理 SELECTDEPTNO,DEPTNAME,COALESCE(MGRNO,ABSENT),ADMRDEPT FROMDEPARTMENT COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。 和oracle的isnull类似,但isnull好象只能两个表达式。 1.11 取得处理的记录数 declarev_countint; update tb_test set t1=0 where t2=2; -检查修改的行数,判断指定的记录是否存在 getdiagnostics v_count=ROW_COUNT; 只对update,insert,delete起作用. 不对selectinto有效 1.12 从存储过程返回结果集(游标)的用法 1、建一sp返回结果集 CREATEPROCEDUREDB2INST1.Proc1() LANGUAGESQL resultsets2(返回两个结果集) - -SQL存储过程 - P1:BEGIN declarec1cursorwithreturntocallerfor selectmarket_code fromtb_market_code; -指定该结果集用于返回给调用者 declarec2cursorwithreturntocallerfor selectmarket_code fromtb_market_code; openc1; openc2; ENDP1 2、建一SP调该sp且使用它的结果集 CREATEPROCEDUREDB2INST1.Proc2( outout_market_codechar(1) LANGUAGESQL - -SQL存储过程 - P1:BEGIN declareloc1,loc2result_set_locatorvarying; -建立一个结果集数组 callproc1; -调用该SP返回结果集。 associateresultsetlocator(loc1,loc2)withprocedureproc1; -将返回结果集和结果集数组关联 allocatecursor1cursorforresultsetloc1; allocatecursor2cursorforresultsetloc2; -将结果集数组分配给cursor fetchcursor1intoout_market_code; -直接从结果集中赋值 closecursor1; ENDP1 3、动态SQL写法 DECLARECURSORC1FORSTMT1; PREPARESTMT1FROM ALLOCATEC2CURSORFORRESULTSET?; 4、注意: 一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。 二、 allocate的cursor不能再次open,但可以close,是closesp中的对应cursor。 1.13 类型转换函数 selectcast(currenttimeaschar(8)fromtb_market_code 1.14 存储过程的互相调用 目前,csp可以互相调用。 Sqlsp可以互相调用, Sqlsp可以调用Csp, 但Csp不可以调用Sqlsp(最新的说法是可以) 1.15 C存储过程参数注意 createprocedurepr_clear_task_ctrl( ININ_BRANCH_CODEchar(4), ININ_TRADEDATEchar(8), ININ_TASK_IDchar(2), ININ_SUB_TASK_IDchar(4), OUTOUT_SUCCESS_FLAGINTEGER) DYNAMICRESULTSETS0 LANGUAGEC PARAMETERSTYLEGENERALWITHNULLS(如果不是这样,sql的sp将不能调用该用c写的存储过程,产生保护性错误) NODBINFO FENCED MODIFIESSQLDATA EXTERNALNAMEpr_clear_task_ctrl!pr_clear_task_ctrl1.16 存储过程fence及unfence fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。 一般而言,fence的存储过程比较安全。 但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。 1.17 SP错误处理用法 如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP, DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都 会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。 处理办法: 定义一个标志变量,比如DECLAREV_STATUSINTEGERDEFAULT0, 在CALLSPNAME之后,SETV_STATUS=1, DECLARECONTINUEHANDLERFORSQLWARNING BEGIN IFV_STATUS1THEN -警告处理,插入日志 SETV_STATUS=0; ENDIF; END; 1.18 import用法 db2importfromgh1.outofDELmessageserr.txtinsertintodb2inst1.tb_dbf_match_ha 注意要加schma 1.19 values的使用 如果有多个set语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。 但要注意,values不能将null值付给一个变量。 values(null)intoout_return_code; 这个语句会报错的。 1.20 给select语句指定隔离级别 select*fromtb_head_stock_balancewithur 1.21 atomic及notatomic区别 atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。 2 DB2编程性能注意 2.1 大数据的导表 应该是export后再load性能更好,因为load不写日志。 比selectinto要好。2.2 SQL语句尽量写复杂SQL 尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。 DB2的SQLEngieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。 Oracle则相反,推荐将复杂的语句简单化,SQLEngieer的优化能力不是特别好。 这是因为每一个SQL语句都会有resetSQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。 一个总的思想就是尽量减少SQL语句的个数。 2.3 SQLSP及CSP的选择 首先,C的sp的性能比sql的sp的要高。 一般而言,SQL语句比较复杂,而逻辑比较简单,sqlsp与csp的性能差异会比较小,这样从工作量考虑,用SQL写比较好。 而如果逻辑比较复杂,SQL比较简单,用c写比较好。 2.4 查询的优化(HASH及RR_TO_RS) db2set DB2_HASH_JOIN=Y (HASH排序优化) 指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。 剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下72秒。 db2set DB2_RR_TO_RS=Y 该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS. 这样,db2不用管理Nextkey,可以少管理一些东西,这样可以提高性能。 2.5 避免使用count(*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冠心病常见症状及护理建议
- 基础营养学概论
- 资助感恩诚信教育
- 2025年法兰球阀项目立项申请报告范文
- 小学生路队训练
- 签订夫妻安全协议书
- 设计文件版权合同范本
- 股份融资合作协议书
- 医保共享协议书范本
- 销售招商合同范本模板
- 中基发展建设工程有限责任公司招聘笔试题库2025
- 静配中心无菌操作技术
- QGDW11447-202410kV-500kV输变电设备交接试验规程
- DL∕T 516-2017 电力调度自动化运行管理规程
- GA/T 974.74-2015消防信息代码第74部分:消防装备器材分类与代码
- 俄歇电子能谱课件
- 消防专项规划说明书
- 六年级上册心理健康教育课件-不盲目攀比 全国通用(共18张PPT)
- 施工用电系统移交确认单
- 公园改造安全文明施工方案
- 正方形性质和判定
评论
0/150
提交评论