使用DB2优化概要强制修改DB2的执行计划
来源:互联网 发布:汉诺塔的非递归算法 编辑:程序博客网 时间:2024/05/24 01:45
DB2中SQL语句的执行计划是DB2优化器根据统计信息来制定的,有的时候,需要人工干预,比如需要强制使用索引扫描。这时候可以使用优化概要来实现。下面的例子中,SQL原本使用了表扫描,在使用了优化概要强制规定使用索引扫描之后,执行计划变成了索引扫描。
测试环境
$ db2levelDB21085I This instance or install (instance name, where applicable: "e105q5a") uses "64" bits and DB2 code release "SQL10055" with level identifier "0606010E".Informational tokens are "DB2 v10.5.0.5", "s141128", "IP23626", and Fix Pack "5".Product is installed at "/opt/IBM/db2/V10.5.5".
未使用优化概要时的执行计划
新建一张分区表,并建立非分区索引,发现SQL语句的访问计划并未使用索引扫描,而是使用了TBSCAN
$ db2 connect to sample$ db2 "create tablespace tbs1" $ db2 "create tablespace tbs2"$ db2 "create tablespace tbs3"$ db2 "CREATE TABLE T1 (ID INTEGER , NAME CHAR(20) ) PARTITION BY RANGE(ID) (PART P1 STARTING(1) ENDING(40) IN TBS1, PART P2 STARTING(41) ENDING(80) IN TBS2, PART P3 STARTING(81) ENDING(120) IN TBS3)"$ db2 "CREATE INDEX IDX1 ON T1 (ID) NOT PARTITIONED"$ db2 "insert into t1 values(1,'a'),(2,'b'),(41,'c'),(42,'d'),(81,'e'),(82,'f')"$ db2 "runstats on table t1 and indexes all"$ db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL$ db2 "set current explain mode explain"$ db2 "select name from t1 where id = 42"$ db2 "set current explain mode no"$ db2exfmt -d sample -g TIC -w -1 -n % -s % -# 0 -o output1.txt执行计划如下:
$ cat output1.txtOriginal Statement:------------------select name from t1 where id = 42Optimized Statement:-------------------SELECT Q1.NAME AS "NAME" FROM E105Q5A.T1 AS Q1 WHERE (Q1.ID = 42)Access Plan:----------- Total Cost: 6.81003 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 1 TBSCAN ( 2) 6.81003 1 | 6 DP-TABLE: E105Q5A T1 Q1
创建优化概要文件
需要先创建一个表systools.opt_profile。还要有一个xml文件:a1.xml中的E105Q5A是实例名,也是默认的模式名。OPTGUIDELINES规定表T1使用索引扫描,使用的索引为IDX1
$ db2 "create table systools.opt_profile (schema VARCHAR(128) not null, name varchar(128) not null, profile blob (2M) not null, primary key (schema, name))"$ cat a1.xml<?xml version="1.0" encoding="UTF-8"?><OPTPROFILE VERSION="10.5.0.5"><STMTPROFILE ID="Use Index Scan instead of Table Scan"><STMTKEY SCHEMA="E105Q5A"><![CDATA[select name from t1 where id = 42]]></STMTKEY><OPTGUIDELINES><IXSCAN TABLE="T1" INDEX="IDX1"/></OPTGUIDELINES></STMTPROFILE></OPTPROFILE>$ cat insert.del"E105Q5A", "PROF1", "a1.xml"$ db2 "import from insert.del of del modified by lobsinfile insert into systools.opt_profile"$ db2set DB2_OPTPROFILE=YES$ db2 terminate$ db2stop$ db2start
使用优化概要文件
$ db2 connect to sample$ db2 set current optimization profile='PROF1' $ db2 set current explain mode explain$ db2 "select name from t1 where id = 42"$ db2 set current explain mode no$ db2exfmt -d sample -g TIC -w -1 -n % -s % -# 0 -o output2.txt
再次查看执行计划,发现使用了索引扫描:
$ cat output2.txtProfile Information:--------------------OPT_PROF: (Optimization Profile Name) E105Q5A.PROF1STMTPROF: (Statement Profile Name) Use Index Scan instead of Table ScanOriginal Statement:------------------select name from t1 where id = 42Optimized Statement:-------------------SELECT Q1.NAME AS "NAME" FROM E105Q5A.T1 AS Q1 WHERE (Q1.ID = 42)Access Plan:----------- Total Cost: 6.81152 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 1 FETCH ( 2) 6.81152 1 /-----+-----\ 1 6 IXSCAN DP-TABLE: E105Q5A ( 3) T1 0.00173777 Q1 0 | 6 INDEX: E105Q5A IDX1 Q1可以看到,根据DB2优化器的估计,这里使用IXSCAN比使用TBSCAN的cost还要高,所以DB2选择了表扫描。在后续的测试中,发现当表的记录数很多的时候,即使没有使用优化概要,DB2也会选择索引扫描。
参考链接
http://www-01.ibm.com/support/docview.wss?uid=swg21430976其他的说明:
https://www.ibm.com/developerworks/data/library/techarticle/dm-0612chen/
https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1008pengxq/
https://www.ibm.com/developerworks/data/library/techarticle/dm-1202storedprocedure/
https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0060612.html
阅读全文
0 0
- 使用DB2优化概要强制修改DB2的执行计划
- db2 执行计划的解读
- db2 概要文件使用
- DB2 SQL执行计划
- db2查看执行计划
- db2 查看执行计划
- DB2查看执行计划
- DB2执行计划
- db2执行计划,个人笔记
- DB2中更新执行计划的几个常见的方法
- db2 的优化
- DB2数据库的优化
- db2 优化基础 查询执行次数最多的SQL
- DB2内存使用过高优化
- DB2优化
- DB2 XQuery 的使用
- DB2 TRUNCATE的使用
- DB2 truncate的使用
- Ubuntu16.04离线安装Nodejs与JDK
- qwb与学姐---之江学院第0届校赛最大生成树+lca
- 实验报告5_JPEG编解码原理及程序调试
- socket编程参考
- 母版页的制作
- 使用DB2优化概要强制修改DB2的执行计划
- 并查集总结
- js导出数据到excel
- 深度强化学习——DQN
- 活动指示器UIActivityIndicatorView
- Intellij Idea不能热部署的解决方法
- bzoj 1029: [JSOI2007]建筑抢修 (贪心+优先队列)
- 如何处理原始文本数据(CNN情感分析yoom例子二)
- 判断一颗树是否为二叉搜索树