当前位置:  数据库>oracle

Oracle走错索引不出结果

    来源: 互联网  发布时间:2017-06-13

    本文导语: 有一个Oracle脚本跑了很久不出结果,优化之后瞬间出结果。原语句如下:SQL> explain plan for  2  select *  3        from crm_dg.tb_ba_channelstaff      a,  4            crm_dg.tb_ba_subscription_hist b,  5            crm_dg.tb_cm_serv          ...

有一个Oracle脚本跑了很久不出结果,优化之后瞬间出结果。原语句如下:
SQL> explain plan for
  2  select *
  3        from crm_dg.tb_ba_channelstaff      a,
  4            crm_dg.tb_ba_subscription_hist b,
  5            crm_dg.tb_cm_serv              c
  6      where a.subs_id = b.subs_id
  7        and b.serv_id = c.serv_id
  8        and a.create_date >= to_date('20150201', 'yyyymmdd')
  9        and c.acc_nbr = '15322926784';

Explained.

Elapsed: 00:00:00.03
SQL> @getplan
'general,outline,starts'

Enter value for plan type:

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1257311340

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                        | Rows  | Bytes | Cost (%CPU)| Time    |
---------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT              |                              |    1 |  562 |    12  (0)| 00:00:01 |
|  1 |  NESTED LOOPS                  |                              |    1 |  562 |    12  (0)| 00:00:01 |
|  2 |  MERGE JOIN CARTESIAN        |                              |    2 |  716 |    8  (0)| 00:00:01 |
|  3 |    TABLE ACCESS BY INDEX ROWID | PROD_INST                    |    1 |  273 |    4  (0)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN          | IX_PROD_INST_NUM            |    1 |      |    3  (0)| 00:00:01 |
|  5 |    BUFFER SORT                |                              |    2 |  170 |    4  (0)| 00:00:01 |
|  6 |    TABLE ACCESS BY INDEX ROWID| TB_BA_CHANNELSTAFF          |    2 |  170 |    4  (0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN          | IDX_BA_CHANNELSTAFF_CRT_DATE |    2 |      |    2  (0)| 00:00:01 |
|*  8 |  TABLE ACCESS BY INDEX ROWID  | ORDER_ITEM_HIST              |    1 |  204 |    2  (0)| 00:00:01 |
|*  9 |    INDEX UNIQUE SCAN          | PKH_ORDER_ITEM              |    1 |      |    1  (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  4 - access("ACC_NBR"='15322926784')
  7 - access("A"."CREATE_DATE">=TO_DATE(' 2015-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
  8 - filter("SERV_ID"="PROD_INST_ID")
  9 - access("A"."SUBS_ID"="ORDER_ITEM_ID")


......getting segment size......

OWNER                SEGMENT_NAME                  SEGMENT_TYPE          Size(Mb)
-------------------- ------------------------------ -------------------- ----------
CRM_DG              IX_PROD_INST_NUM              INDEX                  602.0625
CRM_DG              IDX_BA_CHANNELSTAFF_CRT_DATE  INDEX                1799.5625
CRM_DG              PKH_ORDER_ITEM                INDEX                      6199
CRM_DG              PROD_INST                      TABLE                      5126
CRM_DG              TB_BA_CHANNELSTAFF            TABLE                      7390
CRM_DG              ORDER_ITEM_HIST                TABLE                    48776

6 rows selected.

Elapsed: 00:00:01.26
......getting table infomation......

OWNER                TABLE_NAME                      Size(Mb) PAR DEGREE      NUM_ROWS GLO STATS GATHER TIME
-------------------- ------------------------------ ---------- --- ---------- ---------- --- ------------------
CRM_DG              *PROD_INST                    3958.84835 NO          1  15205690 YES        7.84770833
CRM_DG              PROD_INST                      3958.84835 NO          1  15205690 YES        7.84770833
CRM_DG              *TB_BA_CHANNELSTAFF            5265.49083 NO          1  64956086 YES        102.696563
CRM_DG              TB_BA_CHANNELSTAFF            5265.49083 NO          1  64956086 YES        102.696563
CRM_DG              *ORDER_ITEM_HIST              40876.7086 NO          1  210109488 YES        10.4260532
CRM_DG              ORDER_ITEM_HIST                40876.7086 NO          1  210109488 YES        10.4260532

6 rows selected.

Elapsed: 00:00:01.20
......getting index infomation......

OWNER                INDEX_NAME                    TABLE_NAME                    PAR UNIQUENES DEGREE    INDEX_TYPE LEAF_BLOCKS    BLEVEL CLUSTERING_FACTOR
-------------------- ------------------------------ ------------------------------ --- --------- ---------- ---------- ----------- ---------- ----------------- ----
CRM_DG              IDX_BA_CHANNELSTAFF_CRT_DATE  TB_BA_CHANNELSTAFF            NO  NONUNIQUE 1      NORMAL      84968          2          50669112  36.412511
CRM_DG              IX_PROD_INST_NUM              PROD_INST                      NO  NONUNIQUE 1      NORMAL      37438          2          12501881        100
CRM_DG              PKH_ORDER_ITEM                ORDER_ITEM_HIST                NO  UNIQUE    1      NORMAL    399394          2        166506822        100


这里c和b表都是视图。
最后的结果只有2条记录。返回数据量少,可以考虑嵌套循环走索引。
IDX_BA_CHANNELSTAFF_CRT_DATE非常差的选择性,而且将近1.8G非常大,索引扫描单块读,非常慢。
为了避免走IDX_BA_CHANNELSTAFF_CRT_DATE,这里用了no_index这个hint,oracle自动选择了关联列的索引,而且是主键索引PK_CHANNELSTAFF_SUBS_ID,基本上瞬间出结果。

 


以下是优化后的语句:

SQL> explain plan for
  2  select /*+leading(c,b) use_nl(c,b) no_index(a,IDX_BA_CHANNELSTAFF_CRT_DATE)*/*
  3        from crm_dg.tb_ba_channelstaff      a,
  4            crm_dg.tb_ba_subscription_hist b,
  5            crm_dg.tb_cm_serv              c
  6      where a.subs_id = b.subs_id
  7        and b.serv_id = c.serv_id
  8        and a.create_date >= to_date('20150201', 'yyyymmdd')
  9        and c.acc_nbr = '15322926784';

Explained.

Elapsed: 00:00:00.09
SQL> @getplan
'general,outline,starts'

Enter value for plan type:

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------

Plan hash value: 3198218290

---------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                    | Rows  | Bytes | Cost (%CPU)| Time  |
---------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT              |                        |    1 |  562 |    39  (0)| 00:00:01 |
|  1 |  NESTED LOOPS                |                        |    1 |  562 |    39  (0)| 00:00:01 |
|  2 |  NESTED LOOPS                |                        |    16 |  7632 |    18  (0)| 00:00:01 |
|  3 |    TABLE ACCESS BY INDEX ROWID| PROD_INST              |    1 |  273 |    4  (0)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN          | IX_PROD_INST_NUM        |    1 |      |    3  (0)| 00:00:01 |
|  5 |    TABLE ACCESS BY INDEX ROWID| ORDER_ITEM_HIST        |    16 |  3264 |    14  (0)| 00:00:01 |
|*  6 |    INDEX RANGE SCAN          | IXH_ORDERITEM_SERVID    |    16 |      |    2  (0)| 00:00:01 |
|*  7 |  TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF      |    1 |    85 |    2  (0)| 00:00:01 |
|*  8 |    INDEX UNIQUE SCAN          | PK_CHANNELSTAFF_SUBS_ID |    1 |      |    1  (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  4 - access("ACC_NBR"='15322926784')
  6 - access("SERV_ID"="PROD_INST_ID")
  7 - filter("A"."CREATE_DATE">=TO_DATE(' 2015-02-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
  8 - access("A"."SUBS_ID"="ORDER_ITEM_ID")
SQL>


    
 
 

您可能感兴趣的文章:

  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • WEB前端 iis7站长之家
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • Oracle存储过程如何返回一个结果集&如何获取
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • Oracle的大数据量查询结果显示问题。(高手帮忙)
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Oracle将查询的结果放入一张自定义表中并再查询数据
  • 有关结果数据集的修改-java和ORACLE数据库
  • 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
  • Linux下用SHELL脚本执行带输入输出参数的ORACLE存储过程并得到结果
  • Oracle中返回结果集的存储过程分享
  • oracle sys_connect_by_path 函数 结果集连接
  • 详解如何在Oracle中连接输出结果
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,