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

现象及解决

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

createtablecsy_zj2_acct_0628_t2tablespaceusersnologgingas

SELECT

A.*,

MONTHS_BETWEEN(TO_DATE('201406',

'yyyymm'),

TO_DATE(SUBSTR(TO_CHAR(A.DATE_OPENED_ACCT,

'yyyymmdd'),

1,

6),

'yyyymm')) ASMOB,

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

FROMPUB_SJCJ.csy_zj2_ACCT_0628_T1 A,

RISKREPT.RKO_AMNA B

WHEREA.PARTY_NO=B.PARTY_NO

ANDLENGTH(B.MOBILE_PHONE) = 11

ANDB.MOBILE_PHONELIKE'1%'

;

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

SELECT* FROMTABLE(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* fromvw_table_lhr vwherev.TABLE_NAME='RKO_AMNA';

select* fromvw_table_lhr vwherev.TABLE_NAME='CSY_ZJ2_ACCT_0628_T1';

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

SELECT*

FROMvw_table_index_lhr v

WHEREv.TABLE_NAME= 'RKO_AMNA';

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

优化后sql如下:

createtablecsy_zj2_acct_0628_t2tablespaceusersnologgingas

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')) ASMOB,

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

FROMPUB_SJCJ.csy_zj2_ACCT_0628_T1 A,

RISKREPT.RKO_AMNA B

WHEREA.PARTY_NO=B.PARTY_NO

ANDLENGTH(B.MOBILE_PHONE) = 11

ANDB.MOBILE_PHONELIKE'1%'

;

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

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

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

SELECTdbms_sqltune.report_sql_monitor(sql_id=> 'cg1vcg59qgbp7',

TYPE=> 'active',

report_level=> 'all'

)

FROMdual;

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

SELECTdbms_sqltune.report_sql_monitor(sql_id=> 'cg1vcg59qgbp7',

TYPE=> 'active',

report_level=> 'all',

base_path=> '')

FROMdual;

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

sql实时监控_lhr.zip

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

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

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

SELECTt.qy,

t.ywb,

t.addressid,

t.assemblename,

t.addressid5_id,

t.meid,

t.me_name,

t.me_code,

t.me_spec_cn

FROMxt_addrescover_lhr t

WHEREt.meid= 426296

ANDt.me_specIN

('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

FROMxt_addrescover_lhr t

WHEREt.meid= 426296

ANDt.me_specIN

('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优化中索引这一部分是最重要的一部分,大家一定要活学活用

oracle小表走索引为什么慢,走了索引为啥还像蜗牛一样?相关推荐

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

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

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

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

  3. oracle date引入哪个包,oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题...

    环境: spring jdbc 3.2.3.RELEASE oracle 11.2.0.1.0 - Production 生产环境存在大表(3000万数据):WR_MP_HOURW_R,包含复合主键: ...

  4. Spark性能调优案例-优化spark估计表大小失败 和 小表关联 走 broadcast join

    背景 A任务中关联一张表,该表经过过滤和去重,数据量小于10MB,实际任务耗时较长. B任务关联一张小表,实际任务耗时较长 排查思路 A任务排查 查看spark UIsql界面: 问题1:发现并没有走 ...

  5. oracle 表连接 大表小表_优化必备基础:Oracle中常见的三种表连接方式

    在Oracle SQL语句中,如果from后面有多个表时,表的连接方式是一个很重要的考量. 从Oracle 6开始,优化器就支持下面4种表连接方式: - 嵌套循环连接(Nested Loop Join ...

  6. Oracle之表分区、分区索引(二)

    其实range分区你学会了,其他的分区你也学会了,在这我就不敲了,咱们简单来看一下,hash分区,hash分区实现负载均衡,平均分配值进行分区,那这个哈希就是平均分配的,也是一张表,还是partiti ...

  7. Oracle之表分区、分区索引(一)

    继续往下讲就是分区了 对于ORACLE来讲,分区是咱们开发中最常用的,什么样的场景下要进行分区,主要是针对于大数据量的表,频繁查询的表,我只是说数据量大的表,并没有说物理的这个大,比如你搞一个文件表, ...

  8. oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析

    本文由读者小平同志投稿,小平是一位非常朴实认真的猿,现于某上市证券公司做微服务开发,对 MySQL 优化有深入研究,小平的博客地址是https://blog.csdn.net/weixin_41193 ...

  9. mysql or走索引吗_加了索引,mysql查询就一定会用吗?

    小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况.我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是D ...

最新文章

  1. String字符串相等判断
  2. php对接钉钉_PHP使用POST方法与钉钉对接无返回结果的问题
  3. 花花酱leetcode 题目-二分搜索
  4. linux 进程的缓存区,Linux-标准I/O缓冲区位于进程中那个位置,堆区?栈区?还是其他位置?...
  5. jtag引脚定义_从逆向分析的角度学习硬件调试技巧JTAG,SSD和固件提取
  6. conda创建的环境,打包下载,然后在其他设备离线安装环境,python部署时需要依赖,通过conda一步解决依赖迁移问题
  7. python的egg包的安装和制作]
  8. c++字符串相等比较 char* char[] string
  9. mac 安装 SwitchHosts,链接都不好使了
  10. 前端如何生成条形码---JsBarcode
  11. win10连接校园网(wifi)开热点手机连接显示“已连接但无法访问互联网”解决办法
  12. java的json解析_java中json的使用和解析
  13. java语言要学多久_零基础学JAVA语言难吗!需要多久
  14. 如何修复Microsoft Excel不响应错误
  15. 8c sql手册 五
  16. 利用RunLoop空闲时间执行预缓存任务
  17. MySQL忘记密码怎么修改密码
  18. Linux上下文切换[转]
  19. .Net Core 6.0 解决跨域
  20. 如何将优酷KUX格式转换为MP4格式?

热门文章

  1. 面向对象(四)多态以及多态性,
  2. 陕西科技大学计算机专业课表,陕西科技大学教务管理系统入口:http://jwc.www.sust.edu.cn/...
  3. skycc淘宝客推广软件 V8.2免费版
  4. BINARY和VARBINARY类型的区别
  5. “网上购车平台”又出新模式
  6. JAVA体育用品在线商城系统-springboot【数据库设计、源码、开题报告】
  7. Spark算子实战Java版,学到了
  8. matlab等势面,利用Matlab模拟点电荷系的电场线和等势面
  9. 中晖DVSONE AI-MIS算法中间件简介
  10. 元胞自动机对传染病模型的模拟