oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
1 引言
近期系统常常提示一个sql查询时间过长的问题,看了一下就是一个每天依照时间戳统计前一天量的sql。
表总的数据量为53483065。
语句例如以下:
select count(x.serial_id) as countnum
from iodso.qos_cnst_busilog_td x
where x.oper_time between trunc(sysdate- 1) and trunc(sysdate);
运行时间情况例如以下:(运行要49s)
看了下运行计划 是这种:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2hhaTc5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
从上面的运行计划来看 也是走了索引的 是索引范围扫描。
2 解决
搞不明确 ,决定用count(*) 试试。
运行时间情况例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2hhaTc5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
时间非常快,1s不到。
区别非常大,感觉非常奇怪 就比較了一下 两者的运行计划。以下是count(*)的运行计划
对照了下 发现 慢的那个 多了个 TABLE ACCESS BY INDEX ROWID。
3 结论
得出原因:索引有一个单独的块存储,依据oper_time 统计表的数据量时 仅仅须要在索引的块里面统计数据量就能够了,所以比較快。
那个count(serialid) :
Oracle 索引中保存的是我们字段的值和该值相应的rowid。我们依据索引进行查找,索引范围扫描后。就会返回该block的rowid,然后依据rowid直接去block上去我们须要的数据,因此就出现了:TABLE ACCESS BY INDEX ROWID
由于还要依据rowid回表的数据块上查询数据。所以速度慢了非常多。
4 备注:
以下两个查询的运行时间也非常快,由于运行计划与count(*)都是一样的。
select COUNT(x.oper_time) AS countnum
fromiodso.qos_cnst_busilog_td x
where x.oper_timebetween trunc(sysdate - 1) and trunc(sysdate);
select COUNT(1) AS countnum
fromiodso.qos_cnst_busilog_td x
where x.oper_timebetween trunc(sysdate - 1) and trunc(sysdate);
oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)的更多相关文章
- Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED
Oracle12c开始,我们在获取SQL语句的执行计划时,也会经常看到"TABLE ACCESS BY INDEX ROWID BATCHED"操作,那么,这个操作到底是什么意思呢 ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED3.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED3.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCHE ...
- SQL Server 索引和表体系结构(三)
转自:http://www.cnblogs.com/chenmh/p/3785285.html 包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引 ...
- 【mysql】索引 回表 覆盖索引 索引下推
索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...
- INDEX RANG SCAN无需回表的情况
create table a3 as select * from dba_objects create index a3_idx1 on a3(owner); select owner from a3 ...
- Oracle组合索引与回表
回表 简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作. "回表"一般就是指执行计划里显示的"TABLE ACCESS ...
- 关于 Oracle外键列上是否需要索引问题?
外键列上缺少索引会带来两个问题,限制并发性.影响性能.而这两个问题中的任意一个都可能会造成严重性能问题. 无论是Oracle的官方文档,还是在Tom的书中都说明了两种情况下可以忽略外键上的索引.其 ...
随机推荐
- 通过pl/sql计算程序的运行时间
在sqlplus中运行sql语句或者pl/sql的时候如果需要统计运行的时间,只需要开启set timing on选项即可. SQL> set timing onSQL>SQL> s ...
- 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段
mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段 先看一下 怎么实现动态的自定义字段查询: 例如: 而field 就是数据表中的某一个字段 String f ...
- 《Go语言实战》笔记之协程同步 sync.WaitGroup
原文地址(欢迎互换友链): http://www.niu12.com/article/8 sync 包提供同步 goroutine 的功能 <p>文档介绍</p><cod ...
- SSH远程连接连接其他主机,等待时间过长的原因。
ssh远程连接登录到其他主机,输入登录用户名,等待时间很长时间,然后才出现输入密码的提示.导致这样时间过长,太慢了的原因有两个.(1)当使用ssh远程登录到某个IP时,这个IP的主机系统会读取/etc ...
- linux CMakeLists.txt 语法
CMake入门教程 参考文献:http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html 官方网址:http://www.cmak ...
- Google Chrome插件开发-Context Menus
本节主要介绍如何在Google Chrome浏览器web页面上点击右键弹出自定义菜单,即如何使用谷歌Context Menus API接口.上节已经把主要流程介绍了,这节就直接上代码,代码都是官方例子 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.7.Oracle 11G R2 RAC修改public网络IP
问题:Linuxrac2节点的public网IP被占用,导致集群节点2无法访问 1.禁止相关CRS资源的启动,停止这些资源(vip,listener,scan,scan_listener,databa ...
- python微信公众号开发学习记录
网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...
- Elastic修改副本数量
分片的个数在创建之后是无法再增加和减少的,除非你另外建一个索引库,而副本是可以在运行的时候,动态增加和减少.因此,在创建索引库时,规划好分片(Shard)是非常重要的,而在插入大量数据时可以先将副本书 ...
- [转]Git branching and tagging best practices
Git branching and tagging best practices I am currently learning to use Git by reading Pro Git. Righ ...