oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
来源:互联网 发布:赵丽颖替身 知乎 编辑:程序博客网 时间:2024/05/11 14:35
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)
看了下执行计划 是这样的:
从上面的执行计划来看 也是走了索引的 是索引范围扫描。
2 解决
搞不明白 ,决定用count(*) 试试。
执行时间情况如下:
时间很快,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 TABLE ACCESS BY INDEX ROWID 说明
- table access by index rowid
- table access by index rowid
- TABLE ACCESS BY INDEX ROWID前面的星号
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
- Oracle索引表的使用(Table Index)
- INDEX BY TABLE 记录索引表
- oracle index-by table的遍历
- oracle索引组织表(Index Organizied Table)
- 你不知道的javascript(三)
- 关于z-index 那些你不知道的事
- MySQL 系列(二) 你不知道的数据库操作
- Markdown系列(4)- 你不知道的Markdown基础知识
- MySQL 系列(二) 你不知道的数据库操作
- 那些你不知道的项目管理细节(三)
- 你不知道的JavaScript(三)字符串
- 你不知道的JavaScript(三)闭包
- Make a Simple Gripper
- 黑马程序员——java拾遗之反射机制
- 自己定制spring的数据源
- 智能远程插排的设计
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第4章节--理解你的开发选项 常见的开发人员任务
- oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
- hdu 1034 Candy Sharing Game(暴力模拟)
- <java基础>零起点学Android(一)大体介绍
- 从1.5k到18k, 一个程序员的5年成长之路
- 好的jquery插件链接网站
- Android2.2以上版本下载网络文件getContentLength()大小异常
- freetype-2.4.10.tar.bz2的使用
- C/C++ 中 内存的动态分配 ------很基础但很有用
- BMP: 第一课 Bitmap specification)