查看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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript: 数组

var a[1,2,3] >a[0] 1 >a[1] 2 >a[2] 3 >a[3] undefined >a[-1] undefined for循环遍历每个元素 for(var key in a){console.log(a[key]);} 1 2 3 数组对象对应的方法(method) >a.length//数组元素个数 3>a.push(4)//在数组最后追加元素4>a[1, 2, 3, 4…

SELECT语句使用JDBC和Hibernate批量获取

介绍 现在,我已经介绍了Hibernate对INSERT , UPDATE和DELETE语句的批处理支持,是时候分析SELECT语句结果集的批量提取了。 JDBC ResultSet提供了一个客户端代理游标,用于获取当前语句的返回数据。 执行该语句后,必须将…

linux 更改父进程名称,[Linux进程]在父进程和子进程中分别修改变量

/*这是一个调用fork函数创建一个子进程,然后分别打印输出子进程和父进程中的变量的实例*/#include #include #include #include int glob 6; //外部变量int main(void){int var; //内部变量pid_t pid; //文件标识符var 88;//内部变量printf("…

Spring环境的搭建与测试 (spring2.5.6)

这里是采用的视频里面的spring版本 下载spring2.5.6, 然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下 dist\spring.jar lib\jakarta-commons\commons-logging.jar 上边两个是基本的jar包。。 如果使用了切面编程(AOP),还需要下列…

linux 多核 系统时钟,Linux中的时间

1. Linux中time相关概念1.1 real time指的是实际流逝的时间,又称为Wall Clock Time(墙上时间)。比如,time命令统计出的real time指的是该进程从开始运行到运行结束所消耗的时间。在这段时间内不仅仅执行了该进程,其他进程的时间片也得到了轮转…

经纬度 在线计算距离

http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html 转载于:https://www.cnblogs.com/sgdkg/p/3558112.html

如何使用Hibernate批处理INSERT和UPDATE语句

介绍 JDBC长期以来一直为DML语句批处理提供支持。 默认情况下,所有语句都一个接一个地发送,每个语句都在单独的网络往返中发送。 批处理使我们能够一次性发送多个语句,从而节省了不必要的套接字流刷新。 Hibernate将数据库语句隐藏在事务后写…

【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器

【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器 原文:【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本系列教程,请先看前面的内容。 Batching Handler for ASP.N…

linux 查看系统组账号密码是什么,Linux 用户与组管理详解(system-config-users 命令行)...

用户与组管理用户相关文件组账号相关文件用户和组管理软件:基于命令行的用户和组管理创建用户查看用户信息删除用户修改用户信息为用户创建密码更改用户密码信息创建组删除组查看当前登录到系统的用户用户与组管理什么是用户,用户是人吗?用户…

C++中指针和引用的选择

何时使用引用和指针1. 尽可能使用引用传递参数2. 尽可能的使用const来保护引用和指针3. 在可以使用引用的时候不要使用指针4. 不要试图给引用重新赋值,使之指向另一个变量,这是不可能的(因为引用是变量的别名,和变量是统一的&…

linux 7 没有权限访问,[CentOS 7系列]文件或目录的权限与属性

在开始今天的话题之前,我们首先来回顾下ls命令。在ls命令中参数“-l”会显示出来目标的详细信息,如下所示:[rootserver02~]#ls-l/tmp/总用量4-rwx------.1rootroot8365月2706:19ks-script-ogzDFAdrwxr-xr-x.5rootroot755月3005:26testdrwxr-x…

POJ 2386 Lake Counting DFS水水

http://poj.org/problem?id2386 题目大意: 有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼? 思路: 水题~直接DFS,DFS过程把途中表示水洼的W改为‘.,看…

linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)

1,工具-新建用户密钥生成向导linux2,密钥类型选择:RSA,而后下一步shell3,输入密钥名称和密码ssh4,公钥格式为SSH-OpenSSH,保存为文件(后缀为pub)(记录此文件目录)工具二,登陆在须要免密登陆的主…

ActionBar之style出现Cannot resolve symbol 'Theme' 错误

今天 2014/03/08 00:49 刚刚升级 android studio 到了 0.5.0 版本,修复了许多 bug,包含当前这个问题,之前一直困扰我很久,莫名奇妙的提示主题样式找不到,无法解析, 后来一直谷歌发现很多人都认为是 IDE 的b…

单片机上运行linux程序代码,在Linux下烧录51单片机

原标题:在Linux下烧录51单片机*本文作者:LEdge1,本文属 FreeBuf原创奖励计划,未经许可禁止转载。背景我一直在学习Linux 系统,但是最近还要学习51单片机,所以在Linux下给51单片机烧录程序那是非常必要的。之…

linux运行core控制台程序,VisualStudioCode创建的asp.net core控制台程序部署到linux

1、asp.net core控制台程序static void Main(string[] args){int times10;while(times>0){Console.WriteLine("Hello World!");times--;Thread.Sleep(1000);}}2、发布发布前,修改test2.csproj文件(项目名称为test2)Exenetcoreapp2.1centos.7-x64主要添…

StringTokenizer(字符串分隔解析类型)

java.util.StringTokenizer 功效:将字符串以定界符为界,分析为一个个的token(可理解为单词),定界符可以自己指定。 1、构造函数。1. StringTokenizer(String str) :构造一个用来解析str的StringTokenizer对…

linux 秒数转时间格式,通过delphi将秒数转换成日期格式

摘要将秒数转换成日期格式,是经常用到的一个算法,下面有几个方法,可以借鉴具体代码1:转换成HH:MM:SS格式的字符串格式:function SecondToTime(a:integer):string;beginresult:timetostr(a/86400);end;或者function Sec…

Watch online

1.youku 在优酷看视视频时可登录m.youku.com/wap,在IE上都不需wap,但在chrome上不加会自动跳转成www.youku.com。那上面的视频是一个整体,可以用迅雷下也可在浏览器上直接看。 随便搜了下,发现可直接利用www.youku.com上的视频ID找到上述可直接播放下载的…

java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)

WINDOWS:1.新建一个text文件,将 java -jar D:\eclipse-workspace\attendance\target\mybatis-generator.jar写入,修改文件为.bat文件。2.编写run.vbs文件,新建一个run.text文件,将下面代码写入,然后将文件后缀改为.vbsSet ws Cre…