本帖最后由 〇〇 于 2015-12-24 12:17 编辑

有如下查询,不加hint时,优化器自己选择的执行计划是走全表扫描,花费时间很长,

但加hint强制让大表走skip index时间很短,根据传统的理解,引导列上重复出现的值越少

走skip index的可能越大.但本查询中引导列的重复值也不多,且强制使用skip index后花费的时间

明显减少,在不加hint时,优化器为什么不能自己判断出走skip index后更快的执行计划呢?

哪位大侠能给个skipindex cost计算的公式?谢谢

本查询结构是一个有30条数据的小表,和一个4百万数据的大表关联,大表上有主键索引

主键索引中有两列 如(YMD,SERL_NO),YMD列就是前导列。具体查询和执行计划如下

1使用索引时

SQL_ID  4nr6cv01fxb4s, child number 0

-------------------------------------

SELECT /*+ INDEX_SS(T1 PK_RW_BI_FT_LT) */

T2.SERL_NO

,T1.SI_YMD

,T1.ST_YMD

,T1.ST2_YMD

,T1.SO_YMD

,T1.ACTU_DT

FROM MCS_HQ_READ.RW_BI_FT_LT_BAK T1

,MCS_HQ_READ.UP_LOAD_SERL10 T2

WHERE T1.SERL_NO = T2.SERL_NO

Plan hash value: 2981316369

----------------------------------------------------------------------------------------------------------

| Id  | Operation                    | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

----------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |                 |      1 |        |     29 |00:00:00.03 |    6060 |

|   1 |  NESTED LOOPS                |                 |      1 |     10 |     29 |00:00:00.03 |    6060 |

|   2 |   TABLE ACCESS FULL          | UP_LOAD_SERL10  |      1 |     29 |     29 |00:00:00.01 |       2 |

|   3 |   TABLE ACCESS BY INDEX ROWID| RW_BI_FT_LT_BAK |     29 |      1 |     29 |00:00:00.03 |    6058 |

|*  4 |    INDEX SKIP SCAN           | PK_RW_BI_FT_LT  |     29 |      1 |     29 |00:00:00.03 |    6032 |

----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("T1"."SERL_NO"="T2"."SERL_NO")

filter("T1"."SERL_NO"="T2"."SERL_NO")

2全表扫描时

SQL_ID  c3shr653mx487, child number 0

-------------------------------------

SELECT        T2.SERL_NO

,T1.SI_YMD

,T1.ST_YMD

,T1.ST2_YMD

,T1.SO_YMD

,T1.ACTU_DT

FROM MCS_HQ_READ.RW_BI_FT_LT_BAK T1

,MCS_HQ_READ.UP_LOAD_SERL10 T2

WHERE T1.SERL_NO = T2.SERL_NO

Plan hash value: 1553165350

---------------------------------------------------------------------------------------------------------

| Id  | Operation          | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |

---------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |                 |      1 |        |     29 |00:00:06.16 |     105K|    105K|

|*  1 |  HASH JOIN         |                 |      1 |     10 |     29 |00:00:06.16 |     105K|    105K|

|   2 |   TABLE ACCESS FULL| UP_LOAD_SERL10  |      1 |     29 |     29 |00:00:00.01 |       2 |      0 |

|   3 |   TABLE ACCESS FULL| RW_BI_FT_LT_BAK |      1 |   1379K|   3999K|00:00:03.96 |     105K|    105K|

---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T1"."SERL_NO"="T2"."SERL_NO")

具体统计信息参考

索引统计

INDEX_NAME        INDEX_TYPE        BLEVEL        LEAF_BLOCKS        DISTINCT_KEYS        AVG_LEAF_BLOCKS_PER_KEY        AVG_DATA_BLOCKS_PER_KEY        CLUSTERING_FACTOR        NUM_ROWS

PK_RW_BI_FT_LT        NORMAL        2        24675        3879361        1        1        3819111        3879361

表统计

TABLE_NAME        NUM_ROWS        BLOCKS        EMPTY_BLOCKS        AVG_SPACE        CHAIN_CNT        AVG_ROW_LEN        SAMPLE_SIZE        PARTITIONED

RW_BI_FT_LT_BAK        3999999        105977        0        0        0        190        3999999        NO

前导列YMD统计

COLUMN_NAME        NUM_DISTINCT        LOW_VALUE        HIGH_VALUE        DENSITY        NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE        HISTOGRAM        AVG_COL_LEN

YMD        61         3230313431313030         3230313431323330         0.016393443        0        1        3999999        NONE        9

查看oracle自动优化,使用索引查询更快,优化器为何不能自动识别相关推荐

  1. MySQL 和 Oracle 大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  2. 记Oracle regexp_substr 一拆多查询缓慢sql优化

    需求简化描述: Oralce 一条数据按照特定格式拆分成多行数据 如:1:2:3 拆分成: 1 2 3 源数据如图: 最开始我是这么写的 SELECT DISTINCTREGEXP_SUBSTR( h ...

  3. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  4. JAVA性能优化,让程序更快更稳定

    最新的2017年热门编程语言排行榜已经出炉,java排名第一,纵观目前的市场,无论是IT金融软件服务行业或者云业务或大数据行业,java语言是开发的业务程序运用最广泛的语言之一. 本文主要通过分析云系 ...

  5. 2021-06-21解决列表查询很慢的优化SQL定位查询慢原因优化

    解决问题如下 主要是耗时查询很久的问题! 1.查询定位下SQL是不是有慢查询: EXPLAIN SELECTp.id,p.news_id,parent_news_id,title,app_ids,ne ...

  6. css和js优化_如何为更快的站点优化CSS和JS

    css和js优化 This article was sponsored by Aussie Hosting. Thank you for supporting the partners who mak ...

  7. wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快...

    searcher.Search(types.SearchRequest{Text: "百度中国"}) // 查找满足搜索条件的文档,此函数线程安全 func (engine *En ...

  8. 统计找出一千万以内,一共有多少质数?(优化过程,效率更快)

    质数概念: 只能被1和自己整除的数 ** 初步思路 **:运用双层循环,判断是否为质数,true则num+1:false跳过 代码如下: package somethings;import java. ...

  9. oracle联合主键 索引,关于复合主键查询时使用索引研究

    当数据库创建表时,每个表只能有一个主键,但是如果想让多个列都成为主键时,就要用到复合主键. 一.主键唯一约束 我们知道当某列为主键时,Oracle会自动将此列创建唯一约束.也就是说不允许有相同的值出现 ...

最新文章

  1. 程序员,如何三十而立?
  2. php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...
  3. 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
  4. java多线程基础_java线程基础
  5. 未来无人车市场中,谁最赚钱?
  6. php编写 密码检查,php-检查旧密码和新密码的规则
  7. python 三维矩阵乘以二维矩阵_python 二维矩阵转三维矩阵示例
  8. 人工智能 一种现代方法 第7章 逻辑Agent(命题逻辑)
  9. web前端开发面试题(六)
  10. 校园火灾项目结合Focus
  11. 2014.07.30 Hosts更新
  12. Mapbox GL JS 表达式概述
  13. 移植c语言算法到arm上,μCOS-II移植到ARM处理器上的几个要点
  14. 看懂UML类图和时序图
  15. iPad半年使用心得
  16. HG30-3a型数字式多功能校准仪
  17. Android横屏竖屏切换的问题
  18. 蓝桥试题 算法提高 珠心算测验 JAVA
  19. 在龙芯平台源码安装Qt5.15
  20. 即插即用的PC红外遥控接收器

热门文章

  1. Java实现递归回溯,解决八皇后问题,数据结构与算法
  2. Java基本语法(10)--位运算符
  3. 我的2020(年终总结)
  4. 合并不同gdb下的相同要素_GDB调试学习
  5. CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。...
  6. 自己写的py文件中调用django models
  7. spring boot集成mybatis+事务控制
  8. hihoCoder 1092 : Have Lunch Together
  9. CentOS6 下Vim安装和配置
  10. c语言main函数的参数argc,argv说明