我们都知道,应用系统在运行一段时间后,用户报告系统运行会变慢,使他们不能完成所有的工作,完成事务和处理查询花费过长时间,或者应用程序在一天的某些时段变慢,要确定造成问题的本质原因,必须评估系统资源的实际使用情况并进一步分析资源使用的瓶颈所在。

用户通常报告一下性能问题:

l  事务或查询的响应时间比预期长

l  事务吞吐量不足以完成必需的工作负载

l  事务吞吐量减少

DB2要提高性能的方法,简单的可从以下四个方面下手:

SQL

Bufferpool

Lock

SORTHEAP

 

 

那么如何能获得最佳性能的SQL呢? 下面我们了解一下DB2 提供的几种相关工具:

Ø  DB2 Visual Explain

DB2 Visual Explain 能够获得可视化的查询计划。有了查询计划,我们就可以有针对的对查询进行优化。根据查询计划找出代价最高的扫描 ( 表扫描,索引扫描等 ) 和操作 (Join,Filter,Fetch 等 ),继而通过改写查询或者创建索引消除代价较高的扫描或操作来优化查询。

Ø  db2exfmt

db2exfmt 命令能够将 Explain 表中存储的存取计划信息以文本的形式进行格式化输出。db2exfmt 命令将各项信息更为直观的显示,使用起来更加方便。

Ø  db2expln

db2expln 命令和前面说过的 Visual Explain 功能相似。通过该命令可以获得文本形式的查询计划。db2expln 是命令行下的解释工具。

Ø  db2advis

db2advis 是 DB2 提供的另外一种非常有用的命令。通过该命令 DB2 可以根据优化器的配置以及机器性能给出提高查询性能的建议。

 

就目前来说,我们用的最多的是db2advis, 因为此工具给的建议更直观,这种建议主要集中于如何创建索引,这些索引可以降低多少查询代价,需要创建哪些表或者 Materialized Query Table(MQT) 等。因此以下我们主要来分析如何用db2advis提高SQL语句查询性能。

 

 

db2advis命令如下所示:

db2advis -d <db_name> -a <user>/<password> -i <sql.file> -o <output>
Example: db2advis -d test_db -a user/password -i D:\temp\sql_2.txt > D:\temp\sql_2_result_db2advis.txt

db2数据库中通常出现消耗时间成本很高的sql语句,耗时长的sql语句会长时间占用各种资源,如CPU, Memory, 事务日志等,增加其他sql语句的等待时间,导致整个数据库性能变差。因此我们会时刻监控性能差的sql。

以下的例子是我在南基仓库碰到一个性能很差的语句。

我们这边首先收到告警:

[BOMC]告警、级别:2,IP地址:172.16.5.48,告警时间:2017-02-08 07:04:42,告警内容: 172.16.5.48*BASSDB_LE_DBS-执行超过1个小时且长时间占用大量事务日志应用:进程号1573执行时长89;

当我登陆上去查看时sql已经跑完,于是通过进程号1573查询对应的历史记录查到以下sql语句:

select op_time, channel_city_name, channel_region_name, promo_name, promo_id , cond_name , cond_id, user_id, product_no , valid_date , channel_name , channel_type1 , channel_type2 , channel_type3 , op_id , op_name

from (select * from (  select  rownumber() over(order by channel_city_id asc) as row_,temp_.*

from (select  *  from bass2.stat_act_repeat_order a where 1=1  and a.op_time='2017-01-17' order by channel_city_id asc ) as temp_ )

as temp2_ where row_  between 0+1 and 15) a

由于语句较长,我将这个语句封装到test2.sql中来执行优化,优化之前要确定语句之间没有断句,并且不能有双引号““,如有的话将其替换成单引号‘’。

以下是详细的优化过程:

bash-3.2$ db2advis -d bassdb -i test2.sql                    ----我们把待优化的sql语句写在test.sql2里,这种方法适合较长的sql

Using user id as default schema name. Use -n option to specify schema

CALL SYSPROC.GET_DBSIZE_INFO failed, sqlcode = -443. Getting database size from the catalog tables.

execution started at timestamp 2017-02-08-09.52.12.667113

found [1] SQL statements from the input file

Recommending indexes...

total disk space needed for initial set [  15.060] MB          ----需要创建的索引总大小

total disk space constrained to         [2227893.025] MB

Trying variations of the solution set.

1  indexes in current solution

[3428.0000] timerons  (without recommendations)           ----未优化前所需花费时间成本为3428

[ 96.0000] timerons  (with current solution)                  ----预计优化后所需花费时间成本为96

[97.20%] improvement                                    ----可提升查询效率为97.20%,提升的效果明显

Db2advis建议创建索引(如何创建显示在以下“LIST OF RECOMMENDED INDEXES”),成本预计从3428降低到96,查询效率提升97.20%,

--

--

-- LIST OF RECOMMENDED INDEXES

-- ===========================

-- index[1],   15.060MB                                  ----所需添加的索引所占的空间是15.06MB。

CREATE INDEX "DB2INST1"."IDX1702101953330" ON "BASS2   "."STAT_ACT_REPEAT_ORDER"

("OP_TIME" ASC, "CHANNEL_CITY_ID" ASC, "OP_NAME" ASC,

"OP_ID" ASC, "CHANNEL_TYPE3" ASC, "CHANNEL_TYPE2"

ASC, "CHANNEL_TYPE1" ASC, "CHANNEL_NAME" ASC, "VALID_DATE"

ASC, "PRODUCT_NO" ASC, "USER_ID" ASC, "COND_ID" ASC,

"COND_NAME" ASC, "PROMO_ID" ASC, "PROMO_NAME" ASC,

"CHANNEL_REGION_NAME" ASC, "CHANNEL_CITY_NAME" ASC)

ALLOW REVERSE SCANS COLLECT SAMPLED DETAILED STATISTICS;

COMMIT WORK ;

--

--

-- RECOMMENDED EXISTING INDEXES

-- ============================

--

--

-- UNUSED EXISTING INDEXES

-- ============================

-- ===========================

--

14 solutions were evaluated by the advisor

DB2 Workload Performance Advisor tool is finished.

为避免全表扫描,db2advis建议添加一个索引,但是我们可以看到,添加的索引的关键字比较多,这样会占用不必要的空间,因为db2advis一般给出的建议也不能完全采纳,所以需要我们DBA来进一步分析怎样创建索引才能用最低成本实现最高效率。

以下为test2.sql中的sql语句

select op_time, channel_city_name, channel_region_name, promo_name, promo_id , cond_name , cond_id, user_id, product_no , valid_date , channel_name , channel_type1 , channel_type2 , channel_type3 , op_id , op_name

from (select * from (  select  rownumber() over(order by channel_city_id asc) as row_,temp_.*

from (select  *  from bass2.stat_act_repeat_order a where 1=1  and a.op_time='2017-01-17' order by channel_city_id asc ) as temp_ )

as temp2_ where row_  between 0+1 and 15) a

从以上语句大概分析了一下,主要搜索的关键字可能会集中在channel_city_id 和 op_time,所以我们建索引只包含这两个关键字段。经过一系列变更管控流程后,我们把索引添加上,再跑一次db2advis, 看一下结果如何:

bash-3.2$ db2advis -d bassdb -i test2.sql

Using user id as default schema name. Use -n option to specify schema

CALL SYSPROC.GET_DBSIZE_INFO failed, sqlcode = -443. Getting database size from the catalog tables.

execution started at timestamp 2017-02-08-14.58.45.473590

found [1] SQL statements from the input file

Recommending indexes...

total disk space needed for initial set [   0.000] MB

total disk space constrained to         [2232773.544] MB

Trying variations of the solution set.

0  indexes in current solution

[ 76.0000] timerons  (without recommendations)    ----目前需消费的时间成本已经由之前的3428降低到76

[ 76.0000] timerons  (with current solution)

[0.00%] improvement                            ----没有可以提升的

--

--

-- LIST OF RECOMMENDED INDEXES

-- ===========================

--  no indexes are recommended for this workload.

--

--

-- RECOMMENDED EXISTING INDEXES

-- ============================

-- RUNSTATS ON TABLE "BASS2   "."STAT_ACT_REPEAT_ORDER" FOR SAMPLED DETAILED INDEX "DB2INST1"."IDX1702110408560" ;

-- COMMIT WORK ;

--

--

-- UNUSED EXISTING INDEXES

-- ============================

-- ===========================

--

3 solutions were evaluated by the advisor

DB2 Workload Performance Advisor tool is finished.

等一下,上面那个例子我们是不是漏了什么?在加了索引后没有更新统计数据!!!

现在跑一下runstats统计更新后的索引,我们再来看一下现在的db2advis 结果

bash-3.2$ db2advis -d bassdb -i test2.sql

Using user id as default schema name. Use -n option to specify schema

CALL SYSPROC.GET_DBSIZE_INFO failed, sqlcode = -443. Getting database size from the catalog tables.

execution started at timestamp 2017-02-08-14.58.45.473590

found [1] SQL statements from the input file

Recommending indexes...

total disk space needed for initial set [   0.000] MB

total disk space constrained to         [2234220.950] MB

Trying variations of the solution set.

0  indexes in current solution

[ 31.0000] timerons  (without recommendations)  ----目前需消费的时间成本再由之前的76降低到31

[ 31.0000] timerons  (with current solution)

[0.00%] improvement  ----没有可以提升的

--

--

-- LIST OF RECOMMENDED INDEXES

-- ===========================

--  no indexes are recommended for this workload.

--

--

-- RECOMMENDED EXISTING INDEXES

-- ============================

-- RUNSTATS ON TABLE "BASS2   "."STAT_ACT_REPEAT_ORDER" FOR SAMPLED DETAILED INDEX "DB2INST1"."IDX1702110408560" ;                         ----这里提示要更新索引的统计数据,其实刚才我们                       

已经执行过了,所以说db2advis有一些建议可

以自己再斟酌一下。

-- COMMIT WORK ;

--

--

-- UNUSED EXISTING INDEXES

-- ============================

-- ===========================

--

3 solutions were evaluated by the advisor

DB2 Workload Performance Advisor tool is finished.

从以上的结果可以看出,我们选择的索引关键字是正确的,已经没有可以再提升的空间,并且在添加索引之后记得再次收集统计数据,才能获得更准确的评估值。

总结:

1.       db2advis提供的建议需根据实际情况再做修改,力求以最低的成本实现最高的查询性能;

2.       在执行db2advis之前确保所有涉及的表已经收集了统计数据,能提高提供的数据的准确率;

3.       添加了新的索引后,索引也需要收集统计数据,虽然不会对数据库的实际优化后的性能产生影响,但是会影响DBA对优化后的性能评估。

转载于:https://blog.51cto.com/5063935/2074305

DB2性能优化 – 如何通过db2优化工具提升SQL查询效率相关推荐

  1. 使用AIGC工具提升论文阅读效率

      大家好,我是herosunly.985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用.曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名.拥有多项发明专利.对机器学 ...

  2. PLSQL_案例优化系列_学会应用工具进行SQL整体优化(案例11)

    2014-10-11 Creatd By BaoXinjian 一.摘要 从案例中学会应用工具进行SQL整体优化 1. 性能工具 2. 整体性工具要点 3. 案例的分享 4. 思考与总结 二.性能工具 ...

  3. exists查询慢_8个SQL查询效率优化原则

    点击上方"Java秃头哥",选择"星标" 每天分享优质干货 1.对查询进行优化,应尽可能避免全表扫描 首先应考虑在 where 及 order by 涉及的列上 ...

  4. mysql 查询分析工具下载_SQL分析工具下载-SQL查询工具(DB Solo)下载v5.2.5官方版-西西软件下载...

    DB Solo是一款完美的数据库查询分析工具.软件优秀跨平台SQL查询功能,支持所有主要DBMS产品:主要用于POJO的J2EE代码生成器,EJB 3.0批注,使用DAO  模式的JDBC持久层,JU ...

  5. 负载均衡服务器性能数据,用缓存服务器负载均衡 提数据库查询效率

    [IT168 资讯] 根据一些专家的调查分析,发现企业在使用数据库的时候,90%以上主要用来查询.有些企业这个比例甚至更高.也就说,用户对数据库的操作,其实更新操作占的比例很少.大部分的操走都只是查询 ...

  6. 微信小程序开发04 性能优化:借助微信开发者工具提升小程序性能

    你好,我是周俊鹏. 前几节课我们分别从架构层(双线程模型).链路层(授权模型).和应用层(自定义组件)三个角度学习了小程序的技术要点.它们能帮你完成一个微信小程序的基本业务逻辑和交互逻辑. 逻辑的第一 ...

  7. 提高SQL查询效率(SQL优化)

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...

  8. Select SQL查询效率优化原则

    1.尽量避免where中包含子查询: 2.where条件中,过滤量最大的条件放在where子句最后: 3.采用绑定变量有助于提高效率: 4.在索引列上使用计算.改变索引列的类型.在索引列上使用!=将放 ...

  9. oracle数据分布不均,oracle性能优化操作七:索引提高数据分布不均匀时查询效率...

    索引的选择性低,但数据的分布差异很大时,仍然可以利用索引提高效率. A.数据分布不均匀的特殊情况下,选择性不高的索引也要创建. 表ServiceInfo中数据量很大,假设有一百万行,其中有一个字段Di ...

最新文章

  1. 解决在vscode使用webpack指令显示“因为在此系统中禁止运行脚本“问题
  2. python真的那么火吗-Python语言为什么这么火?
  3. C++ Primer 5th笔记(chap 18 大型程序工具)虚继承
  4. Microsoft Forefront TMG(ISA2008)简体中文商业版(MBE)发布
  5. github持续集成的设置_如何使用GitHub Actions和Puppeteer建立持续集成管道
  6. Yii2.0数据格式器
  7. mie散射理论方程_散射,原子分子散射
  8. mysql用户管理设置权限_mysql 用户管理和权限设置
  9. 单片机 数字电压表(ADC0809)
  10. 中医预约挂号系统,代煎取药功能原来这样用?
  11. 微信文章图片防盗链,下载到本地
  12. JavaScript中常用的的字符串方法总结+详解
  13. 用rest造句子_rest造句
  14. CSS3解决连续英文字符或数字不能自动换行的问题
  15. 百度新闻推荐真的在推荐新闻吗
  16. 网工压轴题个人总结背诵版   专题二 配置VTP和STP
  17. P1264 复制书稿
  18. docker for mysql
  19. 表格(HTML和CSS属性)
  20. 南阳OJ 题目64:小学生算术

热门文章

  1. BP神经网络学习笔记
  2. 小酌重构系列[4]——分解方法
  3. 计算机应用领域中CAL代表,计算机应用领域.doc
  4. 实现python调用Matlab的.m文件
  5. 写个dump_stack【转】
  6. Java编程思想日志
  7. Unity 程序始终显示在最上层,并且保持交互。
  8. 按版面抓取饮水思源照片
  9. 2017计算机组装,2017电脑组装配置
  10. iOS10 配置ATS