DB2相关程序优化建议.docx
- 文档编号:26879270
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:11
- 大小:20.78KB
DB2相关程序优化建议.docx
《DB2相关程序优化建议.docx》由会员分享,可在线阅读,更多相关《DB2相关程序优化建议.docx(11页珍藏版)》请在冰豆网上搜索。
DB2相关程序优化建议
DB2相关程序优化建议
一、程序开发建议
注意程序锁的利用
DB2有十分严格的锁机制,存在锁升级的概念,锁也需要占用必然的缓存空间,当程序的行级锁达到必然数量后可升级为表级锁,表锁达到必然数量后可升级为库级锁,将整个数据库锁住。
因此在写程序的时候咱们要十分关注程序锁的利用,尤其是对应并发性高的程序。
隔离级别要紧用于操纵在DB2依照应用提交的SQL语句向DB2数据库中的相应付象加锁时,会锁住哪些纪录,也确实是锁定的范围。
隔离级别的不同,锁定的纪录的范围可能会有专门大的不同。
隔离级别分为RR/RS/CS/UR这四个级别。
下面让咱们来一一论述:
1.RR隔离级别:
在此隔离级别下,DB2会锁居处有相关的纪录。
在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。
具体的锁的类型仍是由操作的类型来决定,若是是读取,那么加共享锁;若是是更新,那么加独占锁。
由于会锁定所有为取得SQL语句的结果而扫描的纪录,因此锁的数量可能会很庞大,那个时候,索引的增加可能会对SQL语句的执行有专门大的阻碍,因为索引会阻碍SQL语句扫描的纪录数量。
2.RS隔离级别:
此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。
不论是读取,仍是更新,若是SQL语句中包括查询条件,那么会对所有符合条件的纪录加相应的锁。
若是没有条件语句,也确实是对表中的所有记录进行处置,那么会对所有的纪录加锁。
3.CS隔离级别:
此隔离级别仅锁住当前处置的纪录。
4.UR隔离级别:
此隔离级别下,若是是读取操作,可不能显现任何的行级锁。
关于非只读的操作,它的锁处置和CS相同。
在这四种隔离级别中,CS是缺省值。
这四种隔离级别均能够保证DB2数据库在并发的环境下可不能有数据丢失的情形发生。
要注意的是若是对纪录进行了修改,需要在相应的纪录上加独占类型的锁,这些独占类型的锁直到交易终止时才会被释放,这一点在四种隔离级别下都是相同的。
到那个地址,咱们已经对DB2中的表锁,行锁,隔离级别进行了论述。
DB2数据库的并发操纵主若是通过这些机制。
明白得了这些概念,咱们就能够够在利用DB2数据库时依照系统的实际需要来设计锁模式和隔离级别,来实现咱们的系统要求,在保障数据平安的前提下,提供较好的并发性。
如上针对隔离级别的说明,咱们在对大表,尤其是并发性高的大表进行查询是必然要指定隔离级别,在语句的最后加上withur。
注意清空表的方式
不管是在oracle仍是DB2中delete的性能都是较低的,因为delete需要回归段记录日记,oracle提供了一种全表清空的高效方式truncate语句,而在DB2中没有一样的语句,DB2也提供了一种快速清空表的方式,这种方式在建表时需要加一个属性,如下:
CREATETABLE(
BRAND_IDBIGINTNOTNULL,
BRAND_NAMEVARCHAR(200),
BRAND_STATEVARCHAR(3),
BRAND_DESCVARCHAR(250),
EFF_DATETIMESTAMP,
EXP_DATETIMESTAMP,
BRAND_FLAGCHARACTER
(1),
PARENT_IDBIGINT
)
INPRM_TBS_32
notloggedinitially
PARTITIONINGKEY(BRAND_ID)USINGHASHING;
然后在清空表时利用如下语句:
altertable[name]activatenotloggedinitiallywithemptytable
Sql的编写原那么
DB2的sql编写规那么和oracle有所不同,oracle不管是在写程序仍是存储进程中尽可能是化繁为简,将复杂的sql语句尽可能拆开,分成多条sql进行处置,能够有效的提高程序的运行效率。
而在DB2中那么恰恰相反,咱们在写sql的时候尽可能将多个sql语句写成一个负责的语句来处置,如此反而效率更高。
缘故是DB2的sql解析处置引擎要远好于oracle,越是关于复杂的sql解析处置的速度优势越明显。
反而DB2的程序写的进程,sql过量,若是事务处置不行,容易造成锁升级致使程序跑不出来死住的情形。
存储进程必要的参数
创建存储进程语句(CREATEPROCEDURE)能够包括很多参数,尽管从语法角度讲它们不是必需
的,可是在创建存储进程时提供它们能够提高执行效率。
下面是一些经常使用的参数
允许SQL(allowed-SQL)子句的值指定了存储进程是不是会利用SQL语句,若是利用,其类型如
何。
它的可能值如下所示:
●NOSQL:
表示存储进程不能够执行任何SQL语句。
●CONTAINSSQL:
表示存储进程能够执行SQL语句,但可不能读取SQL数据,也可不能修改SQL数据。
●READSSQLDATA:
表示在存储进程中包括可不能修改SQL数据的SQL语句。
也确实是说该贮存进程只从数据
库中读取数据。
●MODIFIESSQLDATA:
表示存储进程能够执行任何SQL语句。
即能够对数据库中的数据进行增加、删除和修
改。
若是没有明确声明allowed-SQL,其默许值是MODIFIESSQLDATA。
不同类型的存储进程执行的
效率是不同的,其中NOSQL效率最好,MODIFIESSQLDATA最差。
若是存储进程只是读取数
据,可是因为没有声明allowed-SQL使其被看成对数据进行修改的存储进程来执行,这显然会降低
程序的执行效率。
因此创建存储进程时,应当明确声明其allowed-SQL。
游标利用建议
在DB2的游标利用中与oracle有一点十分不同的地方,当Declare一个游标,然后open进行循环取数据时,默许情形若是在每次循环中都需要commit事务,那么游标会失效,无法取得游标下一个值,若是循环体中没有事务提交操作,那么可不能显现如上情形。
那若是咱们需要每次循环提交事务时该如何处置呢?
,需要在Declare游标的时候增加一个withhold属性,类似语句如下:
EXECSQLDECLAREchnKpiInitCurCURSORWITHHOLDFOR
SELECTgroup_id,base_flagFROMts_chn_kpi_nodeWHEREvalid_flag=1ORDERBYgroup_id;
EXECSQLOPENchnKpiInitCur;
合理利用临时表
咱们在贮存进程开发中常常利用临时表。
合理的利用临时表能够简化程序的编写,提供执行效率,
但是滥用临时表一样也会使得程序运行效率降低。
临时表一样在如下情形下利用:
1.临时表用于存储程序运行中的临时数据。
例如,若是在一个程序中第一条查询语句执行的结果会
被后续的查询语句用到,那么咱们能够把第一次查询的结果存储在一个临时表中供后续查询语句使
用,而不是在后续查询语句中从头查询一次。
若是第一条查询语句超级复杂和耗时,那么上面的策略是超级有效的。
2.临时表能够用于存储在一个程序中需要返回多次的结果集。
例如,程序中有一个很耗资源的多表
查询,同时,该查询在程序中需要执行多次,那么就能够够把第一次查询的结果集存储在临时保中,
后续的查询只需要查临时表就能够够了。
3.临时表也能够用于让SQL访问非关系型数据库。
例如,能够编写程序把非关系型数据库中的数据
插入到一个全局临时表中,那么咱们就能够够对其数据进行查询。
咱们可利用DECLAREGLOBALTEMPORARYTABLE语句来概念临时表。
DB2的临时表是基于会
话的,且在会话之间是隔离的。
当会话终止时,临时表的数据被删除,临时表被隐式卸下。
对临时
表的概念可不能在中显现下面是概念临时表的一个例如:
概念临时表
DECLAREGLOBALTEMPORARYTABLEgbl_temp
LIKEperson
ONCOMMITDELETEROWS
NOTLOGGED
INusr_tbsp
此语句创建一个名为gbl_temp的用户临时表。
概念此用户临时表所利用的列的名称和说明与
person的列的名称和说明完全相同。
创建有两个字段的临时表
DECLAREGLOBALTEMPORARYTABLE
(
IDINTEGERdefault3,
NAMECHAR(30)
)
--WITHREPLACE
NOTLOGGED;
--INUSER_TEMP_01;
此语句创建了一个有两个字段的临时表。
理论上临时表是不需要显示DROP的,因为它是基于会话的,当临时表基于的连接关闭的时候,临
时表也就不存在了。
可是在实际开发中会有一些情形需要咱们对临时表加以注意。
一种情形确实是被挪用的存储进程的返回值是一个基于临时表的结果集。
当存储进程执行完毕的时
候,临时表并非会消失,因为返回的结果集相当于一个指针,指向临时表所在的内存地址,现在临
时表是可不能被DROP掉的。
这种情形下,既不能在存储进程中删除那个临时表,也不该该由客户应
用显示的删除临时表,这就容易显现一些问题。
二、经常使用DB2命令及说明
数据库连接写法
db2connecttostdmdb(数据库名称)user用户名using密码
数据库sqlcode码说明查找
db2cmd进入db2命令模式,打db2进入db2模式
针对具体的sqlcode,打?
SQLXXXXN即可打开帮忙文档
查看具体的sqlcode码说明
通过SQL获取当前日期,时刻,时刻戳的方式
SELECTcurrentdateFROM
SELECTcurrenttimeFROM
SELECTcurrenttimestampFROM
关于时刻的一些计算:
currentdate+1YEAR
currentdate+3YEARS+2MONTHS+15DAYS
currenttime+5HOURS-3MINUTES+10SECONDS
DB2左连接方式的写法(与oracle对照)
Oracle:
selecta.*fromtd_chn_group_msga,ts_chn_group_statusbwhere=(+)
DB2:
selecta.*fromtd_chn_group_msgaleftouterjoints_chn_group_statusbon=
查看锁记录
getsnapshotforlocksonstdmdb(数据库名称)
查看数据库客户端连接信息
listapplicationfordatabasestdmdb(数据库名称)showdetail
查看数据库的配置信息
getdbcfgforstdmdb(数据库名称)
修改数据库的配置信息
db2updatedbcfgforstdmdb(数据库名称)usinglogfilsiz6000
具体的配置项,配置项的值
断掉所有的应用程序
forceapplicationall
断掉指定的应用程序
forceapplication(程序pid)
查看所有节点上的表空间利用情形
selectsubstr(TABLESPACE_NAME,1,20)asTBSPC_NAME,bigint(TOTAL_PAGES*PAGE_SIZE)/1024/1024as"TOTAL(MB)",used_pages*PAGE_SIZE/1024
/1024as"USED(MB)",free_pages*PAGE_SIZE/1024/1024as"FREE(MB)"fromtable(snapshot_tbs_cfg('stdmdb',-2))assnapshot_tbs_cfg;
简单的类型转换函数
money为IntegerInteger---->charchar(money)
char------->IntegerInteger(trim(char(money)))
money为double(8,2)double----->charchar(cast(moneyasdecimal(8,2)))
char------->double
cast(cast(char(castasdecimal(8,2)))asdecimal(8,2))asdouble)
money为decimal(8,2)decimal------->charDigits(money)
char------->decimalcast(Digits(money)asdecimal(8,2))
money为datedate------>charchar(money)
char------>datedate(trim(char(money)))
money为bigintbigint---->charchar(money)
char----->bigintcast(char(money)asbigint)
:
包括每一行对应于表或视图中概念的列
:
包括每一行包括的所有列
:
包括每一行对应于表或视图中概念的每一个索引
:
所创建每一个表,视图,别名对应其中一行
:
所创建每一个视图对应其中一行或几行
三、DB2性能监控及调优
统计值更新(runstat)
个人以为这种似与oracle的表分析
适时更新数据统计信息。
–当向表装入数据并创建了适合的索引时。
–当用REORG有效程序从头组织表时。
–当存在大量阻碍表及其索引的更新、删除和插入操作时。
(此处的“大量”可能意味着10%到20%的表和索引数据都受到了阻碍。
)
–在绑定性能相当重要的应用程序之前。
–当预取数量发生转变时。
只有当进行显式的请求时,对象的统计信息才会在系统目录表中被更新。
更新部份或全数统计信息方式:
–利用RUNSTATS(运行统计信息,runstatistics)有效程序。
–利用“reorgchkupdatestatistics”命令。
在利用RUNSTATS以后需要从头绑定利用静态SQL的应用程序,使查询优化器就能够够选择新统计信息所给出的最正确存取方案。
可是,关于利用动态SQL的应用程序而言,没必要进行从头绑定,因为语句的优化是依照统计信息在运行时进行的。
整库执行的脚步如下:
db2–vconnecttoDB_NAME
db2–v“selecttbname,nleaf,nlevels,stats_timefrom”
db2–vreorgchkupdatestatisticsontableall
db2–v“selecttbname,nleaf,nlevels,stats_timefrom”
db2–vterminate
单表的执行脚本如下:
db2–vrunstatsontableTAB_NAMEandindexesall
查看数据库是不是执行了runstats
db2–v“selecttb_name,nleaf,nlevels,stat_timefrom”
涉及到性能的几个数据库参数
LOGBUFSZ日记缓冲区的大小
APPHEAPSZ应用程序堆的大小
SORTHEAP排序堆的大小
SHEAPTHRES排序堆阀值
MAXAGENTS数据库接收代理程序的最大数量
NUM_POOLAGENTS代理程序池的大小
NUM_INITAGENTS空闲代理程序的初始数量
LOCKLIST分派给锁列表的存储容量
MAXLOCKS应用程序持有的锁列表的百分比
LOCKTIMEOUT应用程序为获取锁所等待的秒数
MAXAPPLS数据库应用程序并发连接的最大数量
NUM_IOCLEANERS异步页清除程序的数量
需要依照应用程序搜集到的信息,具体调整相应的的参数配置。
DB2性能监控工具Spotlight的利用
Spotlight是一个功能十分壮大的图形化数据库监控工具,提供对数据库各方面性能及相关值的监控。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DB2 相关 程序 优化 建议
![提示](https://static.bdocx.com/images/bang_tan.gif)