同事说,有个语句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分钟的更多相关文章

  1. Oracle index hint syntax

    Question:  I added an index hint in my query, but the hint is being ignored.  What is the correct sy ...

  2. MySQL中的索引提示Index Hint

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

  3. redis 集群分配哈希曹

    重新分配哈希曹: ip:port 为当前redis集群任意节点ip和port redis-cli --cluster reshard ip:port 操作如图: 分配哈希槽有两种方式: 1.在其他节点 ...

  4. iOS程序中的内存分配 栈区堆区全局区

    在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...

  5. 索引Hint提示(INDEX Hint)

    定义:所谓的索引Hint提示,就是强制查询优化器为一个查询语句执行扫描或者使用一个指定的索引 前提:利用索引提示的前提就是当前表存在索引了,如果是堆表的情况,只能通过表扫描获取数据了. 用处:很多时候 ...

  6. mysql index hint 在index不存在时的处理

    关于index_hint 在mysql查询语句中可以通过指定index_hint来告诉优化器如何使用索引,详细可以参考这里 index_hint: USE {INDEX|KEY} [FOR {JOIN ...

  7. ExtJS4 根据分配不同的树形菜单在不同的角色登录后

    继续我的最后.建立cookie后,带他们出去 var userName = Ext.util.Cookies.get('userName'); var userAuthority = Ext.util ...

  8. 【PR笔记】一、打造希区柯克变焦效果

    1. 导入素材,“链接选择项”关闭,删除音频 2. 添加效果--视频效果--扭曲--视频稳定器, 然后程序帮我们自动稳定 3.视频首尾添加关键帧,首帧缩放200%  尾帧不变, 使视频前后的主体大小差 ...

  9. C++变量内存分配及类型修饰符

    前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变 ...

随机推荐

  1. ETL几种方案对比

  2. MVC实现类似QQ的网页聊天功能-Ajax(上)

    说到QQ聊天,程序员首先想到的就是如何实现长连接,及时的接收并回馈信息.那么首先想到的就是Ajax,Ajax的运行机制是通过XMLHttpRequest向服务器发出异步请求,并接受数据,这样就可以实现 ...

  3. 小学生之KTV播放原理

    第一步: 创建一个Song类 //歌曲名称 public  string SongName { get; set; } //歌曲路劲 public string SongPath { get; set ...

  4. iOS 点击cell下拉

    iOS  点击cell下拉 代码如下: #import "ViewController.h" @interface ViewController ()<UITableView ...

  5. Collection使用方法

    package cn.stat.p3.conection.demo; import java.util.ArrayList; import java.util.Collection; import j ...

  6. 你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序

    4.1.6 操作符之间的优先顺序 在表达一些比较复杂的条件判断时,在同一个表达式中,有时可能会存在多个操作符.比如,我们在判断要不要买某个西瓜时,不仅要判断它的总价(单价8.2元/斤,一共10.3斤) ...

  7. 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……

    4.2.2  表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...

  8. (原)windows8.1上使用opencv for python

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...

  9. C# 过滤SerialPort端口

    C#中的SerialPort类只能通过SerialPort.GetPortNames()来获取端口名字,而且出来都是COM+数字的字样,如果我要识别COM端口是什么设备的,它就无能为力了,此时我们可以 ...

  10. js定时跳转

    在项目中有时会用到定时跳转,自己收藏了一个比较好用的 js写的,不依赖jQuery <script type="text/javascript"> function c ...