aaarticlea/png;base64,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">
温馨提醒:

TMP_007数据量为:409373

1.去除在谓词列上编写的任何标量函数

优化前:(耗时3.1s)

SELECT START_DATE,CST_NM FROM TMP_007 WHERE YEAR(TO_DATE(START_DATE,'YYYYMMDD'))='2009'

优化后:(耗时0.922s)

SELECT START_DATE,CST_NM FROM TMP_007 WHERE START_DATE BETWEEN '20090101' AND '20091231'

总结:

DB2可以选择使用START_DATE上的列索引,但是在列上使用了函数后,DB2就无法使用列索引了,从而导致查询效率变低。

2.去除在谓词列上编写的任何数学运算

优化前:(耗时10.265)

SELECT ACCT_ID,CST_ID,CONTRACT_AMT FROM TMP_007 WHERE CONTRACT_AMT*0.1 > 10000

优化后:(耗时3.39s)

SELECT ACCT_ID,CST_ID,CONTRACT_AMT  FROM TMP_007 WHERE CONTRACT_AMT > 10000/0.1

总结:

DB2查询时候,会优先选择列CONTRACT_AMT上的索引,如果直接对列CONTRACT_AMT应用数学运算,DB2就无法使用索引了。一定要做到:列本身(不加数学运算)放在操作符的一边,而所有的计算都放在另外一边。



3.SQL语句中指定查询列

优化前:(耗时13.15s)

SELECT * FROM TMP_007

优化后:(耗时2.922s)

SELECT ACCT_ID,CST_ID,CONTRACT_AMT  FROM TMP_007

总结:

如果Select包含不需要的列,优化工具会选择Indexonly=’N’,这会强制DB2必须进入数据页来得到所请求的特定列,这就要求更多的I/O操作,梁歪,这些多余的列可能是某些排序的部分,这样一来就需要和传递一个更大的排序文件,相应的会使排序成本更高。



4.尽可能不使用distinct

优化前:(耗时0.687s)

SELECT DISTINCT CST_ID FROM TMP_007 ;

优化后:(耗时0.437s)

SELECT CST_ID FROM TMP_007  GROUP BY  CST_ID;

总结:

在测试distinct与group by性能的过程中,在列CST_ID上添加索引后,发现group by 确实比distinct快一些,但是在数据分布比较离散的情况下使用group by ,比较集中的情况下使用distinct.表数据量较少的情况随便使用哪个都一样,不管选择谁,都要建立索引


5.Exists、in、not in 、not exists的使用场景选择

5.1 in跟exists的区别:

例如:表A(小表),表B(大表)

优化前:(耗时1.93s)

select * from A where cc in(select cc from B)  -->效率低,用到了A表上cc列的索引;

优化后:(耗时1.125s)

select * from A where exists(select cc from B where cc=A.cc)  -->效率高,用到了B表上cc列的索引。

相反的,

优化前:(耗时1.9s)

select * from B where cc in(select cc from A)  -->效率高,用到了B表上cc列的索引

优化后:(耗时1.0s)

select * from B where exists(select cc from A where cc=B.cc)  -->效率低,用到了A表上cc列的索引。

总结:

in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

简称:子大Exists,子小in

5.2 not in 与 not exists区别:

如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。


6.尽可能使用union all来代替union

优化前:(耗时15.344s)

SELECT ACCT_ID,CST_NAME FROM TMP_007
UNION
SELECT ACCT_ID,CUST_NM FROM TMP_008

优化后:(耗时2.719s)

SELECT ACCT_ID,CST_NAME FROM TMP_007
UNION ALL
SELECT ACCT_ID,CUST_NM FROM TMP_008

总结:

在union中,DB2最后会自动执行一个排序来消除重复值,这样是很耗费资源的,所以在不需要去重复的情况下,尽可能使用UNION ALL 代替union

N.模板

优化前:(耗时3.1s)


优化后:(耗时0.922s)


总结:


【DB2】SQL优化的更多相关文章

  1. DB2 SQL性能调优秘笈

    SQL优化技巧 1.去除在谓词列上编写的任何标量函数 2.去除在谓词列上编写的任何数学运算 3.SQL语句的Select部分只写必要的列 4.尽可能不用Distinct 5.尽量将In子查询重写为Ex ...

  2. MS SQL优化

    数据库优化实践[MS SQL优化开篇]   数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应 ...

  3. db2性能优化

    性能优化概述 DB2 的性能优化可以从三个方面分析:内存,CPU 和 I/O .DB2 性能优化是一件较为复杂的综合性的工作 , 需要对问题的根源作全方位的探索和思考.同时也需要较深厚的数据库管理经验 ...

  4. 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习

    <高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...

  5. SQL优化之SQL 进阶技巧(上)

    由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...

  6. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

  7. sql 优化

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...

  8. SQL 优化总结

    SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects         SELECT name as '函数名称',xtype as XType  FROM  s ...

  9. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  10. sql优化阶段性总结以及反思

    Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...

随机推荐

  1. Swift3.0:NSURLConnection的使用

    一.介绍 应用中也不必不可少的会使用网络通信,增强客户端和服务器的交互,可以使用NSURLConnection实现http通信. NSURLConnection提供了异步请求和同步请求两种请求方式.同 ...

  2. HTML中的转义字符 (转)

    HTML中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用它们的转义序列,如下所示: & 或 & &a ...

  3. 基于JT/T808协议的车辆监控平台架构方案

    技术支持QQ:78772895 1.接入网关应用采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接.上行以及下行消息的解码.编码.流量控制,黑白名单等安全控制 ...

  4. 大数据开发实战:MapReduce内部原理实践

    下面结合具体的例子详述MapReduce的工作原理和过程. 以统计一个大文件中各个单词的出现次数为例来讲述,假设本文用到输入文件有以下两个: 文件1: big data offline data on ...

  5. Android -- ViewPager切换动画,PageTransformer

    transformPage(View view, float position) view就是滑动中的那个view,position这里是float类型,是当前滑动状态的一个表示,比如当滑动到正全屏时 ...

  6. 梯度消失(vanishing gradient)与梯度爆炸(exploding gradient)问题

    (1)梯度不稳定问题: 什么是梯度不稳定问题:深度神经网络中的梯度不稳定性,前面层中的梯度或会消失,或会爆炸. 原因:前面层上的梯度是来自于后面层上梯度的乘乘积.当存在过多的层次时,就出现了内在本质上 ...

  7. Robot Framework + Selenium library + IEDriver环境搭建

    转载:https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录: 1 安装文件准备2 Robot框架结构3 环境搭建  3.1 安装Python  ...

  8. (纪录片)电的故事 Shock & Awe The Story of Electricity

    简介: 导演: Tim Usborne主演: Jim Al-Khalili类型: 纪录片 / 传记 / 历史官方网站: www.bbc.co.uk/programmes/p00kjq6d制片国家/地区 ...

  9. [海蜘蛛] 海蜘蛛 V8 全线无限试用版 免费发布破解教程

    http://bbs.p52.cn/forum.php?mod=viewthread&tid=3499&extra=page%3D1&page=1&_dsign=79c ...

  10. C#.NET常见问题(FAQ)-构造器constructor有什么用

    所谓的构造器constructor,就是声明类的时候定义一个public 类名的方法,这个方法不需要传递任何数据,这样的话在声明任何类的实例的时候都会无条件执行里面的方法   析构器只在程序销毁的时候 ...