查看oracle自动优化,使用索引查询更快,优化器为何不能自动识别
本帖最后由 〇〇 于 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自动优化,使用索引查询更快,优化器为何不能自动识别相关推荐
- MySQL 和 Oracle 大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- 记Oracle regexp_substr 一拆多查询缓慢sql优化
需求简化描述: Oralce 一条数据按照特定格式拆分成多行数据 如:1:2:3 拆分成: 1 2 3 源数据如图: 最开始我是这么写的 SELECT DISTINCTREGEXP_SUBSTR( h ...
- oracle直查和call哪个更快,让oracle跑的更快1读书笔记二
当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net 网友分享于:2013-08-23 浏览:9次 <> ...
- JAVA性能优化,让程序更快更稳定
最新的2017年热门编程语言排行榜已经出炉,java排名第一,纵观目前的市场,无论是IT金融软件服务行业或者云业务或大数据行业,java语言是开发的业务程序运用最广泛的语言之一. 本文主要通过分析云系 ...
- 2021-06-21解决列表查询很慢的优化SQL定位查询慢原因优化
解决问题如下 主要是耗时查询很久的问题! 1.查询定位下SQL是不是有慢查询: EXPLAIN SELECTp.id,p.news_id,parent_news_id,title,app_ids,ne ...
- css和js优化_如何为更快的站点优化CSS和JS
css和js优化 This article was sponsored by Aussie Hosting. Thank you for supporting the partners who mak ...
- wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快...
searcher.Search(types.SearchRequest{Text: "百度中国"}) // 查找满足搜索条件的文档,此函数线程安全 func (engine *En ...
- 统计找出一千万以内,一共有多少质数?(优化过程,效率更快)
质数概念: 只能被1和自己整除的数 ** 初步思路 **:运用双层循环,判断是否为质数,true则num+1:false跳过 代码如下: package somethings;import java. ...
- oracle联合主键 索引,关于复合主键查询时使用索引研究
当数据库创建表时,每个表只能有一个主键,但是如果想让多个列都成为主键时,就要用到复合主键. 一.主键唯一约束 我们知道当某列为主键时,Oracle会自动将此列创建唯一约束.也就是说不允许有相同的值出现 ...
最新文章
- 程序员,如何三十而立?
- php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...
- 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
- java多线程基础_java线程基础
- 未来无人车市场中,谁最赚钱?
- php编写 密码检查,php-检查旧密码和新密码的规则
- python 三维矩阵乘以二维矩阵_python 二维矩阵转三维矩阵示例
- 人工智能 一种现代方法 第7章 逻辑Agent(命题逻辑)
- web前端开发面试题(六)
- 校园火灾项目结合Focus
- 2014.07.30 Hosts更新
- Mapbox GL JS 表达式概述
- 移植c语言算法到arm上,μCOS-II移植到ARM处理器上的几个要点
- 看懂UML类图和时序图
- iPad半年使用心得
- HG30-3a型数字式多功能校准仪
- Android横屏竖屏切换的问题
- 蓝桥试题 算法提高 珠心算测验 JAVA
- 在龙芯平台源码安装Qt5.15
- 即插即用的PC红外遥控接收器