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 你不知道的索引回表-开发系列(三)的更多相关文章

  1. Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED

    Oracle12c开始,我们在获取SQL语句的执行计划时,也会经常看到"TABLE ACCESS BY INDEX ROWID BATCHED"操作,那么,这个操作到底是什么意思呢 ...

  2. [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 ...

  3. [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 ...

  4. [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 ...

  5. SQL Server 索引和表体系结构(三)

    转自:http://www.cnblogs.com/chenmh/p/3785285.html 包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引 ...

  6. 【mysql】索引 回表 覆盖索引 索引下推

    索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...

  7. INDEX RANG SCAN无需回表的情况

    create table a3 as select * from dba_objects create index a3_idx1 on a3(owner); select owner from a3 ...

  8. Oracle组合索引与回表

    回表 简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作. "回表"一般就是指执行计划里显示的"TABLE ACCESS ...

  9. 关于 Oracle外键列上是否需要索引问题?

    外键列上缺少索引会带来两个问题,限制并发性.影响性能.而这两个问题中的任意一个都可能会造成严重性能问题.   无论是Oracle的官方文档,还是在Tom的书中都说明了两种情况下可以忽略外键上的索引.其 ...

随机推荐

  1. JavaScript基础入门教程(一)

    本系列教程的说明 本教程说白了可以说是我自己学习JavaScript的笔记,主要内容参考自<JavaScript权威指南>,部分内容可能来自互联网,本系列教程假设学者之前学过c或者其它的编 ...

  2. Context Menus

    转载:http://open.chrome.360.cn/extension_dev/contextMenus.html 内容 清单 范例 API 参考: Chrome.contextMenus 方法 ...

  3. 解析PHP中如何将数组变量写入文件

    在用PHP记录日志,或者是 Ajax 请求出错想要 debug 的时候.我们一般都会将信息写入到一个指定的文件当中.然后根据相应的信息来处理问题.比如笔者最喜欢在用 Ajax 取不到数据的时候,在PH ...

  4. RocketMQ里的一个获取时间的工具类SystemClock

    看rocketmq源码的时候发现他们还给时钟封装里一下. /** * Licensed to the Apache Software Foundation (ASF) under one or mor ...

  5. Linux环境搭建:2. 安装Ubuntu虚拟机

    我家淘宝店,主要协助同学做毕业设计:https://shop104550034.taobao.com/?spm=2013.1.1000126.d21.pPCzDZ 1. 创建虚拟机 1. 打开VMwa ...

  6. Node.js mm131图片批量下载爬虫1.00 iconv协助转码

    //====================================================== // mm131图片批量下载爬虫1.00 // 2017年11月15日 //===== ...

  7. 在Eclipse中点击ctrl+h打开搜索界面,范围指定的项目中搜索包含person的文件

    ctrl+h ===>File Search Tab ===>在containing text里输入person,scope ==>selected resources,搜索就可以了

  8. P2P终结者和反P2P终结者如何使用

    1 安装软件并运行,首先扫描网络,第一台控制机就是自己,你可以查看IP,和命令提示符下的IP吻合. 2 点击高级选项,指定本机网络环境和网卡 3 控制规则设置,首先设置全局限速模板,其他的差不多. 4 ...

  9. 使用WinScp连接远程服务器和传输文件

    早在3月份,我就使用到了WinScp,WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议. 它的主要功能就是在本地与远程计算机间安全的复制文件..WinSc ...

  10. python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...