一个有关走了索引为啥还是这么慢的例子

  1. 现象及解决

最近发现一个同事的一个建表sql跑了一天的时间了还没有跑完的迹象,于是决定对其优化优化,原sql如下:

create table csy_zj2_acct_0628_t2 tablespace users nologging as

SELECT

A.*,

MONTHS_BETWEEN(TO_DATE('201406',

'yyyymm'),

TO_DATE(SUBSTR(TO_CHAR(A.DATE_OPENED_ACCT,

'yyyymmdd'),

1,

6),

'yyyymm')) AS MOB,

B.CHINESE_NAME,

B.GENDER,

B.BIRTHDAY,

B.CERTIFICATION_NO,

B.CUST_TYPE,

B.MOBILE_PHONE,

B.BILLING_ADDR,

B.HOME_ADDR,

B.EMPLOYER,

B.EMPLOYER_ADDR

FROM PUB_SJCJ.csy_zj2_ACCT_0628_T1 A,

RISKREPT.RKO_AMNA B

WHERE A.PARTY_NO = B.PARTY_NO

AND LENGTH(B.MOBILE_PHONE) = 11

AND B.MOBILE_PHONE LIKE '1%'

;

sql看着很简单,从外表上看没有什么问题,老规矩,先看看执行计划再说,找到sqlid,然后在sqlplus中执行

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ghfrjwd78yf2q',0,'advanced')); 得到内存中的执行计划,如下图:

执行计划很简单,先扫描表RKO_AMNA上的索引IDX_RKO_AMNA_MBP,然后回表读,然后做2次NL连接操作,即执行计划路径为:5->4->6->3->7->2->1->0 ,cost花费也不是很高,但是我们从Predicate Information中看到一个异常的访问路径,就是第5步,按照道理第5步应该走的是filter过滤的,但是现在成了access访问了,凭经验估计是索引走错了,应该走RKO_AMNA上的PARTY_NO列的索引,当然这只是猜测,我们看一下IDX_RKO_AMNA_MBP是属于哪个列上的就真相大白了,好吧,先看看2个表的数据量吧,因为任何离开数据量谈优化都是没有意义的。

select * from vw_table_lhr v where v.TABLE_NAME='RKO_AMNA';

select * from vw_table_lhr v where v.TABLE_NAME='CSY_ZJ2_ACCT_0628_T1';

可以看出2个表都不是分区表,但是数据量稍微大点,一个2000W,一个1000W,分析日期都是最近分析的,但是不至于跑这么慢吧,再看看IDX_RKO_AMNA_MBP是属于哪个列上的索引呢?

SELECT *

FROM vw_table_index_lhr v

WHERE v.TABLE_NAME = 'RKO_AMNA';

可以看出IDX_RKO_AMNA_MBP是属于MOBILE_PHONE列上的索引,至此说明我们之前的猜测是合理的,oracle每次做nl连接都是去访问索引IDX_RKO_AMNA_MBP的,而不是走唯一索引PK_RKO_AMNA的,操蛋呀,有唯一索引不走,走什么普通索引呀,,,,真是的,,,,,问题找见了那就对其优化优化呗,想了想采用hint来影响其执行计划吧,考虑到数据量大,所以不建议做nl连接,那就做hash连接吧,且让小表做驱动表,这里涉及到表之间的连接关系,有关这一方面的内容这里暂且给大家一个图,详细内容以后再写吧。

优化后sql如下:

create table csy_zj2_acct_0628_t2 tablespace users nologging as

SELECT /*+leading(a) index(b,PK_RKO_AMNA)*/

A.*,

MONTHS_BETWEEN(TO_DATE('201406',

'yyyymm'),

TO_DATE(SUBSTR(TO_CHAR(A.DATE_OPENED_ACCT,

'yyyymmdd'),

1,

6),

'yyyymm')) AS MOB,

B.CHINESE_NAME,

B.GENDER,

B.BIRTHDAY,

B.CERTIFICATION_NO,

B.CUST_TYPE,

B.MOBILE_PHONE,

B.BILLING_ADDR,

B.HOME_ADDR,

B.EMPLOYER,

B.EMPLOYER_ADDR

FROM PUB_SJCJ.csy_zj2_ACCT_0628_T1 A,

RISKREPT.RKO_AMNA B

WHERE A.PARTY_NO = B.PARTY_NO

AND LENGTH(B.MOBILE_PHONE) = 11

AND B.MOBILE_PHONE LIKE '1%'

;

对优化后的sql查询到sqlid,取出内存中的执行计(SELECT * FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR('as4mp6r714m2u',0,'advanced'));

似乎花费cost比优化之前多了,没关系,在oracle中没有绝对的东东,凭经验这个语句应该可以了,为了不丢人,自己先跑得试试,快的话再发给同事修改吧,跑的过程中顺便截取了一下sql的实时监控信息,除了pga占用的有点高其他还算正常吧。

这里列出sql实时监控的sql,如果可以连接到oracle的官方网站的话,可以这样运行:

SELECT dbms_sqltune.report_sql_monitor(sql_id => 'cg1vcg59qgbp7',

TYPE => 'active',

report_level => 'all'

)

FROM dual;

如果不能连接到官网,那么在本地安装了tomcat后,下载相应的文件之后,就可以在本机这样查看:

SELECT dbms_sqltune.report_sql_monitor(sql_id => 'cg1vcg59qgbp7',

TYPE => 'active',

report_level => 'all',

base_path => 'http://localhost:8080/sqlmon')

FROM dual;

有关sql实时监控的这一部分内容以后给大家写博客补上吧,具体html文件参考附件
sql实时监控_lhr.zip

最后跑完的时候我看了下大约就2个小时30分钟,还可以了,就这样吧。

  1. 与此相关还有一个例子,这里列出来供大家参考:

如果一张表上有多个索引且查询条件中多个列都用到了的话,有可能是没有走正确的索引,有的时候创建了组合索引,在用的时候没有走正确的索引,导致很慢。例:

SELECT t.qy,

t.ywb,

t.addressid,

t.assemblename,

t.addressid5_id,

t.meid,

t.me_name,

t.me_code,

t.me_spec_cn

FROM xt_addrescover_lhr t

WHERE t.meid = 426296

AND t.me_spec IN

('com.gxlu.ngrm.equipment.DP',

'com.gxlu.ngrm.equipment.InfoPoint',

'com.gxlu.ngrm.equipment.OBD',

'com.gxlu.ngrm.equipment.OFXHME');

以上查询语句中,xt_addrescover_lhr在meid和me_spec都有索引,如果执行上边的语句可能会走me_spec列上的索引,这个时候导致很慢,几个小时也查询不出来,但是如果走meid的索引就很快了。

SELECT /*+index(t,IDX_ADDRESCOVER_MEID)*/

t.qy,

t.ywb,

t.addressid,

t.assemblename,

t.addressid5_id,

t.meid,

t.me_name,

t.me_code,

t.me_spec_cn

FROM xt_addrescover_lhr t

WHERE t.meid = 426296

AND t.me_spec IN

('com.gxlu.ngrm.equipment.DP',

'com.gxlu.ngrm.equipment.InfoPoint',

'com.gxlu.ngrm.equipment.OBD',

'com.gxlu.ngrm.equipment.OFXHME');

总结

1.本文设计到 执行计划的查看、表之间的连接方式(常用3种)、11g新特性的sql的实时监控等方面的知识,由于篇幅原因没有一一列出,如果有需要以后再写写这些方面的东东吧,看网友需要吧

2.Sql优化有很多经典的例子,但是最基本的都是网上列出来的需要注意的一些事项,本文的情况就属于表上多个索引的选择性问题

3. 有关sql优化中索引这一部分是最重要的一部分,大家一定要活学活用

走了索引为啥还像蜗牛一样相关推荐

  1. oracle小表走索引为什么慢,走了索引为啥还像蜗牛一样?

    一个有关走了索引为啥还是这么慢的例子 现象及解决 最近发现一个同事的一个建表sql跑了一天的时间了还没有跑完的迹象,于是决定对其优化优化,原sql如下: createtablecsy_zj2_acct ...

  2. 走了索引为啥还像蜗牛一样?

    一个有关走了索引为啥还是这么慢的例子 现象及解决 最近发现一个同事的一个建表sql跑了一天的时间了还没有跑完的迹象,于是决定对其优化优化,原sql如下: create table csy_zj2_ac ...

  3. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  4. mysql索引为啥要选择B+树 (上)

    不知道你有没有这种感觉,那些所谓的数据结构和算法,在日常开发工作中很少用到或者几乎不曾用到,可能只是在每次换工作准备面试的时候才会捡起来学习学习. 那我希望今天这篇文章能让你对数据结构的具体应用能有个 ...

  5. hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...

     前言"又要开始新项目了,一顿操作猛如虎,梳理流程加画图.这不,开始对流程及表结构了.我:吧啦吧啦吧啦 --老大:这个建表为啥还设置个自增 id ?直接用流水号(用户号/产品号)当主键不就行 ...

  6. mysql索引为啥要选择B+树 (下)

    有读者在 mysql索引为啥要选择B+树 (上) 上篇文章中留言总结了选择 B+ 树的原因,大体上说对了,今天我们再一起来看看具体的原因. 索引为什么要保存在硬盘中 首先要明白几个概念,服务器存储一般 ...

  7. Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)

    Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from t where t.col=5 我们在执行一条查询的Sql语句时候,在数 ...

  8. 两个datatable合并 主键一样覆盖_MySQL 建表为啥还设置个自增 id ?用流水号当主键不正好么?...

    又要开始新项目了,一顿操作猛如虎,梳理流程加画图.这不,开始对流程及表结构了. 我:吧啦吧啦吧啦 -- 老大:这个建表为啥还设置个自增 id ?直接用流水号(用户号/产品号)当主键不就行了? 我:这个 ...

  9. mysql 对索引limit_【业务学习】关于MySQL order by limit 走错索引的探讨

    Grape 描述 今天在跑脚本的时候发现了几条慢查询,根据之前的经验实属不应该,后来经过查找资料和分析出来结果,在这里简单记录一下. 首先,我的sql是这个样子: select `id` from ` ...

最新文章

  1. 榜单类应用我所喜欢的算法
  2. Javascript 事件propagation机制
  3. 前端学习(2984):一文理解数据劫持2
  4. Vmware Linux 固定IP配置(CenOS7)
  5. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历
  6. Linux之cut命令
  7. Residual Attention Network--2017-【论文理解】
  8. 国产环境小卫星数据预处理及简单应用
  9. ArcGIS 9.3 For JavaScript API 学习笔记
  10. python与plc进行串口通信,寄存器写数据 欧姆龙plc
  11. python函数找钱_找钱问题–动态规划一例
  12. CH6202 黑暗城堡 最短路径生成树
  13. 新型企业最重视的评估手段:360评估
  14. Elasticsearch应用案例1:百度
  15. 云服务下半场,企业增长的超级入口在哪?
  16. virtualbox给CentOS7虚拟机磁盘扩容
  17. 修改Vue项目网页标题和ico
  18. 【报告分享】中国消费者洞察报告-领航前所未有(附下载)
  19. Java and Me --HDU轩少
  20. QPluginLoader 加载插件dll失败

热门文章

  1. win10explorer.exe任务栏卡死修复
  2. unity 实时画面投屏到手机_将Unity实时画面投屏到手机
  3. 教育平台的线上课程推荐策略——课程分级
  4. Mac Microsoft Office校园网下载安装后找不到 登录不上的问题
  5. android imageview设置边框,android ImageView 添加边框
  6. 运维面试精选:3、Docker面试题
  7. 解读动环监控系统架构
  8. 七夕到了, RFM数据分析法帮你分析男朋友值不值得嫁
  9. 双十一买哪款蓝牙耳机划算?性价比高的蓝牙耳机排行榜
  10. Drill界面简单介绍