无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟
- 同事说,有个语句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分钟不到就出结果。
无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟的更多相关文章
- Oracle index hint syntax
Question: I added an index hint in my query, but the hint is being ignored. What is the correct sy ...
- MySQL中的索引提示Index Hint
MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...
- redis 集群分配哈希曹
重新分配哈希曹: ip:port 为当前redis集群任意节点ip和port redis-cli --cluster reshard ip:port 操作如图: 分配哈希槽有两种方式: 1.在其他节点 ...
- iOS程序中的内存分配 栈区堆区全局区
在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...
- 索引Hint提示(INDEX Hint)
定义:所谓的索引Hint提示,就是强制查询优化器为一个查询语句执行扫描或者使用一个指定的索引 前提:利用索引提示的前提就是当前表存在索引了,如果是堆表的情况,只能通过表扫描获取数据了. 用处:很多时候 ...
- mysql index hint 在index不存在时的处理
关于index_hint 在mysql查询语句中可以通过指定index_hint来告诉优化器如何使用索引,详细可以参考这里 index_hint: USE {INDEX|KEY} [FOR {JOIN ...
- ExtJS4 根据分配不同的树形菜单在不同的角色登录后
继续我的最后.建立cookie后,带他们出去 var userName = Ext.util.Cookies.get('userName'); var userAuthority = Ext.util ...
- 【PR笔记】一、打造希区柯克变焦效果
1. 导入素材,“链接选择项”关闭,删除音频 2. 添加效果--视频效果--扭曲--视频稳定器, 然后程序帮我们自动稳定 3.视频首尾添加关键帧,首帧缩放200% 尾帧不变, 使视频前后的主体大小差 ...
- C++变量内存分配及类型修饰符
前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变 ...
随机推荐
- Linux的VI/VIM
参考自:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html 作者:iTech 出处:http://itech.cnblogs.co ...
- (二)一个工作任务引起的乱战——C++程序编译为dll,让C#调用
C++程序编译为C#可调用的dll的过程: 1.新建一个Win32 Console Application 项目,项目名为:DLLDemo,下一步选择Application type为DLL; 2.在 ...
- 锚点链接和hash属性
相信大家挺经常见过这样一个效果.有一个很长很长的页面,分成好几部分,目录中一点击,就能定位到页面某个位置. 例如:有这样一个目录,例如你点击一下“HTML”,就会直接跳转到“HTML”的页面位置 这就 ...
- 【nodejs学习】3.进程管理及异步编程
进程管理 1.调用终端命令实现目录目录拷贝 var child_procress = require('child_procress'); var util = require('util'); fu ...
- displaytag 动态列实现
这种动态列的实现方法来自displaytag-examples-1.2.war提供的示例中,实际上下载下来的zip文件中不仅有各种jar包,还有这个包含各种例子的war包,是学习displaytag的 ...
- java优势
跨平台,只要有JVM(Java虚拟机)的操作系统就可以运行JAVA程序: 安全: 弃用危险的指针: 自动内在管理机制,垃圾回收机制,由垃圾回收器回收,减轻程序负担,也避免了手动回收的危险性: 完全面向 ...
- Linux下的静态IP配置【weber出品】
配置Linux下的静态IP地址 因为服务器的IP地址是固定的,不像我们自己家的笔记本的IP是动态的.所以我们要将这个地址给写成静态的. 直接编辑这个这个配置文件即可: vi /etc/sysconfi ...
- android sax解析xml 文件 动态加载标题
要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...
- jquery节点查询
jQuery.parent(expr) //找父元素 jQuery.parents(expr) //找到所有祖先元素,不限于父元素 jQuery.children ...
- 文成小盆友python-num10 socketserver 原理相关。
本节主要内容: 1.IO多路复用 2.多线程多进程 3.小知识点补充(python中作用域相关) 4.socketserver源码分析补充 一.IO多路复用 I/O多路复用指:通过一种机制,可以监视多 ...