同事说,有个语句5个小时不出结果,叫我帮忙看看,于是叫同事发过来。不看不知道,一看吓一跳,3个表关联,强制使用了2个index hint,当中一个表9g,一个表67g,另一个小表40Mb。开发者,总以为走index就是快的,所以使用了index hint,终于导致走得很慢。
以下是同事发来的语句:
select /*+  parallel(t,4) index(a,IDX_COMMBASUBSHIST_1) index(b,IDX_COMMCMSERVHIST_1)*/    1,    t.DISC_ID,    t.DISC_LEV,    to_date(20140117082042, 'yyyymmddhh24miss'),    t.MSINFO_ID,    t.ORG_ID,    t.SERV_ID,    t.SUBS_ID,    t.OBJ_GRP_ID,    a.SUBS_CODE,    a.SUBS_STAT,    a.SUBS_STAT_REASON,    a.SUBS_STAT_DATE,    a.ACTION_ID,    a.ACTION_TYPE,    a.ACTION_EX_TYPE,    a.ACT_DATE,    a.REQ_ID,    a.STAFF_ID,    a.CMMS_CUST_CODE,    a.SPEED_VALUE,    b.ACC_NBR,    b.CUST_ID,    b.SERV_NBR,    b.CONSUME_GRADE,    b.SERV_LEV,    b.ACCOUNT_NBR,    b.CITY_VILLAGE_ID,    b.SERV_CHANNEL_ID,    b.SERV_STAT_ID,    b.CUST_CLASS_DL,    b.CUST_TYPE_ID,    b.USER_TYPE,    b.USER_CHAR,    b.PAYMENT_TYPE,    b.BILLING_TYPE,    b.PROD_ID,    b.PROD_CAT_ID,    b.EXCHANGE_ID,    b.SERV_COL1,    b.SERV_COL2,    b.AREA_ID,    b.SUBST_ID,    b.BRANCH_ID,    b.STOP_TYPE,    b.CUST_MANAGER_ID,    b.CREATE_DATE,    b.ADDRESS_ID,    b.SUBS_DATE,    b.OPEN_DATE,    b.MODI_STAFF_ID,    b.CMMS_CUST_ID,    b.CUST_NAME,    b.SALES_ID,    b.SALES_TYPE_ID,    b.SERV_ADDR_ID,    t.HIST_CREATE_DATE,    b.ARREAR_MONTH,    b.ARREAR_MONTH_LAST,    t.SALESTAFF_ID,    t.EHOME_TYPE,    t.EHOME_CLASS,    b.strat_grp_dl,    b.sale_org1,    b.sale_org2,    b.sale_org3,    b.location_type,    b.region_flag,    b.terminal_id,    b.pstn_id,    b.fee_id,    b.payment_id,    b.billing_id,    b.strat_grp_xl,    b.fld1,    b.fld3,    b.cust_level,    b.group_cust_type,    b.cust_region,    b.group_cust_grade,    b.control_level,    b.net_connect_type,    b.trade_type_id,    b.acc_nbr2,    b.cdma_class_id,    b.phone_number_id,    b.develop_channel,    b.online_time,    t.wireless_type,    b.new_serv_stat_id,    b.is_phs_tk,    b.serv_grp_type,    b.state,    t.cdma_disc_type,    b.mix_disc,    b.is_3g,    t.add_disc_type,    to_number(nvl(b.business_type, '-1')),    nvl(t.label_num, -1),    b.is_mix_prod,    t.price_id,    t.disc_item_id,    b.STD_SUBST_ID,    b.STD_BRANCH_ID,    t.DISC_ITEM_ID_OP,    t.PRICE_ID_OP,    t.business_type,    b.new_prod_id,    b.BOARD_SUBST_ID,    b.BOARD_BRANCH_ID    from AAA  a,    BBB  b,    CCC t    where a.subs_id = t.subs_id    and b.serv_id = t.serv_id    --同事说开销比較大。有450W。。以下是运行计划:

涉及的表大小:
OWNER   SEGMENT_NAME    SEGMENT_TYPE    Size(Mb)
SUMMARY_SJZ_GZ  CCC   TABLE   40
SUMMARY_SJZ_GZ  BBB   TABLE PARTITION 9016.1875
SUMMARY_SJZ_GZ  AAA   TABLE PARTITION 67330.25    下面是优化思路:
强制使用索引,导致当中9g的表走了index full scan,然后回表。由于除了index fast scan以外,其它索引扫描都是单块读,回表又是单块读。导致速度很慢。优化时考虑使用哈希连接,40Mb的小表作为驱动表,连接9g的表,最后连接超大的67G的表。
优化时使用的技术:
1.  use_hash(a,b),使用哈希表关联方式
2.  /*+parallel(a 5)*/;并行处理
3.  db_file_multiblock_read_count多块读參数设置为最大
4.  workarea_size_policy设置为手工管理
5.  sort_area_size设为接近最大
6.  hash_area_size设为接近最大    alter session enable parallel dml;
alter session set workarea_size_policy=manual;
alter session set sort_area_size=2100000000;
alter session set hash_area_size=2100000000;
alter session set db_file_multiblock_read_count=128;    select  /*+parallel(a,5) parallel(b,5) parallel(t,5) leading(t) use_hash(t,b) user_hash(b,a)*/    1,    t.DISC_ID,    t.DISC_LEV,    to_date(20140117082042, 'yyyymmddhh24miss'),    t.MSINFO_ID,    t.ORG_ID,    t.SERV_ID,    t.SUBS_ID,    t.OBJ_GRP_ID,    a.SUBS_CODE,    a.SUBS_STAT,    a.SUBS_STAT_REASON,    a.SUBS_STAT_DATE,    a.ACTION_ID,    a.ACTION_TYPE,    a.ACTION_EX_TYPE,    a.ACT_DATE,    a.REQ_ID,    a.STAFF_ID,    a.CMMS_CUST_CODE,    a.SPEED_VALUE,    b.ACC_NBR,    b.CUST_ID,    b.SERV_NBR,    b.CONSUME_GRADE,    b.SERV_LEV,    b.ACCOUNT_NBR,    b.CITY_VILLAGE_ID,    b.SERV_CHANNEL_ID,    b.SERV_STAT_ID,    b.CUST_CLASS_DL,    b.CUST_TYPE_ID,    b.USER_TYPE,    b.USER_CHAR,    b.PAYMENT_TYPE,    b.BILLING_TYPE,    b.PROD_ID,    b.PROD_CAT_ID,    b.EXCHANGE_ID,    b.SERV_COL1,    b.SERV_COL2,    b.AREA_ID,    b.SUBST_ID,    b.BRANCH_ID,    b.STOP_TYPE,    b.CUST_MANAGER_ID,    b.CREATE_DATE,    b.ADDRESS_ID,    b.SUBS_DATE,    b.OPEN_DATE,    b.MODI_STAFF_ID,    b.CMMS_CUST_ID,    b.CUST_NAME,    b.SALES_ID,    b.SALES_TYPE_ID,    b.SERV_ADDR_ID,    t.HIST_CREATE_DATE,    b.ARREAR_MONTH,    b.ARREAR_MONTH_LAST,    t.SALESTAFF_ID,    t.EHOME_TYPE,    t.EHOME_CLASS,    b.strat_grp_dl,    b.sale_org1,    b.sale_org2,    b.sale_org3,    b.location_type,    b.region_flag,    b.terminal_id,    b.pstn_id,    b.fee_id,    b.payment_id,    b.billing_id,    b.strat_grp_xl,    b.fld1,    b.fld3,    b.cust_level,    b.group_cust_type,    b.cust_region,    b.group_cust_grade,    b.control_level,    b.net_connect_type,    b.trade_type_id,    b.acc_nbr2,    b.cdma_class_id,    b.phone_number_id,    b.develop_channel,    b.online_time,    t.wireless_type,    b.new_serv_stat_id,    b.is_phs_tk,    b.serv_grp_type,    b.state,    t.cdma_disc_type,    b.mix_disc,    b.is_3g,    t.add_disc_type,    to_number(nvl(b.business_type, '-1')),    nvl(t.label_num, -1),    b.is_mix_prod,    t.price_id,    t.disc_item_id,    b.STD_SUBST_ID,    b.STD_BRANCH_ID,    t.DISC_ITEM_ID_OP,    t.PRICE_ID_OP,    t.business_type,    b.new_prod_id,    b.BOARD_SUBST_ID,    b.BOARD_BRANCH_ID    from SUMMARY_SJZ_GZ.AAA  a,    SUMMARY_SJZ_GZ.BBB  b,    SUMMARY_SJZ_GZ.CCC t    where a.subs_id = t.subs_id    and b.serv_id = t.serv_id   ;  PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 382646192  --------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name                   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                        |   781K|   453M|   260K  (1)| 01:18:03 |       |       |        |      |            |
|   1 |  PX COORDINATOR            |                        |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)      | :TQ10002               |   781K|   453M|   260K  (1)| 01:18:03 |       |       |  Q1,02 | P->S | QC (RAND)  |
|*  3 |    HASH JOIN               |                        |   781K|   453M|   260K  (1)| 01:18:03 |       |       |  Q1,02 | PCWP |            |
|   4 |     PX RECEIVE             |                        |   781K|   379M| 26771   (2)| 00:08:02 |       |       |  Q1,02 | PCWP |            |
|   5 |      PX SEND BROADCAST     | :TQ10001               |   781K|   379M| 26771   (2)| 00:08:02 |       |       |  Q1,01 | P->P | BROADCAST  |
|*  6 |       HASH JOIN            |                        |   781K|   379M| 26771   (2)| 00:08:02 |       |       |  Q1,01 | PCWP |            |
|   7 |        PX RECEIVE          |                        |   781K|    73M|   327   (2)| 00:00:06 |       |       |  Q1,01 | PCWP |            |
|   8 |         PX SEND BROADCAST  | :TQ10000               |   781K|    73M|   327   (2)| 00:00:06 |       |       |  Q1,00 | P->P | BROADCAST  |
|   9 |          PX BLOCK ITERATOR |                        |   781K|    73M|   327   (2)| 00:00:06 |       |       |  Q1,00 | PCWC |            |
|  10 |           TABLE ACCESS FULL| CCC                    |   781K|    73M|   327   (2)| 00:00:06 |       |       |  Q1,00 | PCWP |            |
|  11 |        PX BLOCK ITERATOR   |                        |    23M|  9096M| 26427   (2)| 00:07:56 |     1 |    17 |  Q1,01 | PCWC |            |
|  12 |         TABLE ACCESS FULL  | BBB                    |    23M|  9096M| 26427   (2)| 00:07:56 |     1 |    17 |  Q1,01 | PCWP |            |
|  13 |     PX BLOCK ITERATOR      |                        |   204M|    18G|   233K  (1)| 01:09:58 |     1 |    20 |  Q1,02 | PCWC |            |
|  14 |      TABLE ACCESS FULL     | AAA                    |   204M|    18G|   233K  (1)| 01:09:58 |     1 |    20 |  Q1,02 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------------------------  Predicate Information (identified by operation id):
---------------------------------------------------  3 - access("A"."SUBS_ID"="T"."SUBS_ID")  6 - access("B"."SERV_ID"="T"."SERV_ID")  --5小时不出结果,优化后终于20分钟不到就出结果。

转载于:https://www.cnblogs.com/lcchuguo/p/4060011.html

无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟相关推荐

  1. Index hint 和 Index 的区别

    1,Index hint是在Ax查询的时候强制使用你指定的索引:不建议使用:除非你有十足的把握这个索引是当前最优化并且在未来也是最优化的索引: 2,没有hint是在查询的时候不指定索引,由数据库来决定 ...

  2. mysql hint 索引倒序_MySQL中的索引提示Index Hint

    MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...

  3. 浅析希区柯克的悬念电影:以《惊魂记》为例

    浅析希区柯克的悬念电影:以<惊魂记>为例[1] 一.关于导演:悬念大师的艺术世界[2] 希区柯克是一位独特的导演.他是英国人,1939年二战爆发前夕移居美国,在美国度过了他职业生涯的巅峰时 ...

  4. “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,

    "一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当 ...

  5. 锐捷——DHCP手工分配IP地址

    组网拓扑: 配置要点: 开启DHCP服务 配置DHCP地址池 指定固定IP分配给固定PC机 检查配置,保存 验证配置 查看分配的IP地址信息 配置步骤: 开启DHCP服务 Ruijie>enab ...

  6. suse 调整分区_安装suse linux如何手工分配各个分区大小?

    唉!楼主啊- 1."不好管理"的问题,同意2楼 2."分区容量多大"的问题,楼主你自己装一遍不就知道了么?下面是我刚装完的11.1,用作桌面,KDE3.KDE4 ...

  7. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈

    1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...

  8. 进程的内存分配,四区和五区

    四区和五区 C/C++把内存分为:栈区.堆区.全局区(静态区).常量区.代码区 C/C++中的内存分为四个区域,分别是: 1. 栈区(Stack):由编译器自动分配和释放,存放函数的参数值.局部变量的 ...

  9. dux修改index.php,DUX全站底部推广区修改

    DUX主题默认的全站底部推广区是深灰色的,而且上面除了一行推广文字及两个可选择是否启用的按钮外就没有什么特别的装饰了,一直觉的这默认的推广区丑丑的不适合自己网站风格,最近从网上查找了不少资料终于将它给 ...

最新文章

  1. 教你如果设置自己喜欢的QQ背景音乐
  2. Spring5参考指南:AOP代理
  3. day17(JDBC入门jdbcUtils工具介绍)
  4. append生成新变量的时候,没有如预期(It's a feature,not a bug?)
  5. C语言课后习题(32)
  6. [K/3Cloud] 调用其他界面时通过Session传递对象参数
  7. 数值分析完整思维导图
  8. 数学——每日一题6 1.13 利用定积分的定义求极限
  9. 电脑只有.exe文件不显示后缀名
  10. oracle11204补丁包,Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)
  11. 文章:Mapping regulatory variants controlling gene expression in drought response and tolerance
  12. NPM problem: npm ERR! extraneous
  13. Scala class和case class的区别
  14. 最常用的分布式 ID 解决方案,都在这里了!
  15. 脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?
  16. 丁香园CTO:大龄程序员怎样渡过中年危机?
  17. 网站空间配置和域名解析怎么选择
  18. 混合式开发APP项目——幸福到App
  19. C语言模拟密码输入(显示星号)
  20. OpenCV(三)——图像分割

热门文章

  1. “不裁员的微软” 裁员了!网上哀嚎一片!
  2. 几何画板用迭代法作图的技巧
  3. 关于链接出现 unauthenticated user 用户问题研究
  4. QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面
  5. 阿里国际站装修尺寸是多少1920像素模板阿里巴巴全屏代码装修教程优化美化店铺工具
  6. React (三) 修改props,React父传子、子传父、this绑定
  7. PHP导出word文档的简单实现方法(可导出图片)
  8. 3D效果海报怎么制作设计?如何用PS制作出来!
  9. java实现pdf转为word
  10. TFN全新推出的全功能 手持式频谱分析仪 RMT系列 不仅可干扰定位 还可路测