DB2优化工具使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DB2优化工具使用
DB2提供了多种数据库优化工具,包括db2advis(设计顾问程序)、Visual Explain、db2exfmt、db2expln
数据库优化工作最头疼的事情是什么?
个人认为:
一.没有具体的量化指标(这里指执行sql的开销,包括CPU、磁盘I/O等的开销),来判断优化的效果。程序员只能凭sql语句的
执行时间和以往的经验来判断优化是否成功。
二.数据库查询优化器的优化结果是否理想,由于sql语句是要经过数据库引擎的查询优化器对sql语句进行重整优化,这一过
程是黑盒的,我们无法了解,比如查询条件是否下推?我建
立的索引是否被用到?sql语句执行的是全表扫描还是索引
扫描?这些怎么确定是一个关键问题。
三.对于业务系统需求经常变更的应用系统,怎么从全局角度把握数据库的优化,在运行阶段可能做过优化工作,但是随着
业务的变更,以前做的优化工作变的无效了,怎么重新优化?IBM为我们提供的这几款工具为使我们能够对这些开销的具体数据有全面的了解,了解查询优化器优化后的结果,全局角度了解目前业务系统的优化状况,从而制定优化目标。以上是个人的一点感受,下面切入正题,go.
一. db2advis(设计顾问程序)的使用
设计顾问程序有命令行模式的db2advis,也有图形化界面的设计顾问程序。需要注意的是图形化界面的设计顾问程序依赖于db2advis,如果没有建立过执行计划表的话,先要建立执行计划表,需要在相应数据库里执行 EXPLAIN.DDL,命令如下
db2cmd 进入DB2CLP
db2 connect to
如下图:
执行完后会在数据库中看到建立的执行计划表
接着就是在DB2CLP中执行db2advis命令,
db2advis -d
这里解释一下上面的参数
–d 数据库名称或数据库别名
–m 执行优化的类型(I 索引 M MQT物化查询表 C 多维集群 P 分区)
-n schema name
-a 数据库用户名和密码
-s 要执行的sql
-o 将结果保存到文件中 (注意-o只给出了优化方案,并没给出开销
和性能提升的百分比,可以不用这个而在最后加上 >xxx.txt 来包结果输出到文本中)
详细的参数可以在DB2CLP中输入 db2advis 命令查看
以下是一个执行的例子:
db2advis -d cs -n db2inst1 -m I -s "select
bp.id,bc.brand_code,cb.brand_name,bbp.id as b_id,sbp.id as s_id, sbp.plan_amount1 as ssg,sc.sg as sg ,sbp.is_normal1
s_is1,bbp.plan_amount1 as bsg, sbp.plan_amount2 as szg,sc.zg as zg ,sbp.is_normal2 s_is2,bbp.plan_amount2 as bzg,
sbp.plan_amount3 as sxl,sc.xl as xl ,sbp.is_normal3
s_is3,bbp.plan_amount3 as bxl, sbp.plan_amount4 as
sscfe,sc.scfe as scf ,sbp.is_normal4 s_is4,bbp.plan_amount4 as bscfe,case when coalesce(h.OCT_LOWER_LIMIT,0)>0 or coalesce(h.OCT_UPPER_LIMIT,0)>0 then case when
coalesce(sc.sg,0)
coalesce(h.OCT_LOWER_LIMIT,0)>0 then case when
coalesce(sc.sg,0) coalesce(h.REP_LOWER_LIMIT,0)>0 or coalesce(h.REP_UPPER_LIMIT,0)>0 then case when coalesce(sc.zg,0) coalesce(h.REP_LOWER_LIMIT,0)>0 then case when coalesce(sc.zg,0) coalesce(h.SALE_LOWER_LIMIT,0)>0 or coalesce(h.SALE_UPPER_LIMIT,0)>0 then case when coalesce(sc.xl,0) coalesce(h.SALE_LOWER_LIMIT,0)>0 then case when coalesce(sc.xl,0) coalesce(h.MARKER_LOWER_LIMIT,0)>0 or coalesce(h.MARKER_UPPER_LIMIT,0)>0 then case when coalesce(sc.scfe,0) coalesce(sc.scfe,0)> h.MARKER_UPPER_LIMIT then '否' else '是' end when coalesce(h.MARKER_LOWER_LIMIT,0)>0 then case when coalesce(sc.scfe,0)