转载:遇到BITMAP CONVERSION TO ROWIDS 后解决与思考
今天遇到一个案例,有点价值写下来,以后多看看 SQL: select t.order_id, t.spec_name, t.staff_code, t.staff_code as xxbStaffCode, t.channel_id as xxbChannelId,
t.area_code, t.create_time, t.id_card
from zmkm_intent_order t, zmkm_order_ext_val s
where t.order_id = s.order_id
and exists (select 1
from JS_SERVICE.zmkm_order_ext_val k
where k.order_Id = t.order_id
and k.param_id = ''
and k.ext_val = '')
and t.deal_flag = 0
and t.area_code = ''; 执行计划:
SQL的性能瓶颈在ID = 3.仔细看E-rows 才330条, 偏小很多。 但是为啥是 330呢。 分别explain plan for select count(1) from zmkm_order_ext_val k where k.param_id = '';
select count(1) from zmkm_order_ext_val k where k.ext_val = '' rows 第一个是21万, 第二个是5千。但是BITMAP CONVERSION TO ROWIDS参与后就330. 就是因为rows 估算成330,导致这个搞成驱动表。 因此导致两个索引合并后真实数据量是9千, 大量的回表K。造成了性能问题。 如果这边搞成被驱动表, 那么显然就是根据索引访问K。并且此时驱动表的数据也不多,大概是 1000多条 NL下去也是不错的。 想到这边差不多知道答案了。期间尝试 数次 cardinality hint 无果。 SQL> alter session set "_b_tree_bitmap_plans"=false; 会话已更改。 已选择352行。 执行计划
----------------------------------------------------------
Plan hash value: 141468126 ----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5254 | 815K| 2288 (1)| 00:00:28 |
| 1 | NESTED LOOPS | | 5254 | 815K| 2288 (1)| 00:00:28 |
| 2 | NESTED LOOPS SEMI | | 330 | 44880 | 1627 (0)| 00:00:20 |
| 3 | TABLE ACCESS BY INDEX ROWID| ZMKM_INTENT_ORDER | 405 | 39285 | 7 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_ACODE_DFLAG | 405 | | 1 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID| ZMKM_ORDER_EXT_VAL | 269 | 10491 | 4 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_ORDER_ID | 16 | | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX_ORDER_ID | 16 | 368 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 4 - access("T"."AREA_CODE"='' AND "T"."DEAL_FLAG"=0)
5 - filter("K"."EXT_VAL"='' AND "K"."PARAM_ID"='')
6 - access("K"."ORDER_ID"="T"."ORDER_ID")
7 - access("T"."ORDER_ID"="S"."ORDER_ID") 统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
4518 consistent gets
0 physical reads
0 redo size
13485 bytes sent via SQL*Net to client
725 bytes received via SQL*Net from client
25 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
352 rows processed alter session set "_b_tree_bitmap_plans"=false;--- 加入这个后逻辑读减少到 4518。 但是还有其他办法吗?? 答案是有的。 看到有问题的执行计划, 就是在两个索引合中取数据, 那么如果建立组合索引, 把该要的数据全部集中在索引中。 那么就没有必要在两个索引中取数据了。 建立索引 index ( PARAM_ID,EXT_VAL, ORDER_ID); 也就是9万多数据。 应该在7百个逻辑读左右。 结合另一张表访问也是7百个逻辑读。 不过此时hash 。 能控制在 1600 逻辑读左右。 1 适合用sqlprofile 立即绑定执行计划 ,适合线上快速改变执行计划 2 适合实施简单方便, 因为有些时候 DBA和业务是隔开的, 让业务绑定执行计划,反正我是没有去交接过。 不如扔一个建索引语句,说建立一下即可。
---------------------
作者:越烟
来源:CSDN
原文:https://blog.csdn.net/daiqiulong2/article/details/88824518
版权声明:本文为博主原创文章,转载请附上博文链接!
转载:遇到BITMAP CONVERSION TO ROWIDS 后解决与思考的更多相关文章
- BITMAP CONVERSION FROM ROWIDS
在有些执行计划中,可以会看到 BITMAP CONVERSION FROM ROWIDS这样的东东,也许你会感觉奇怪,我没有使用位图索引怎么出现了bitmap.我通过一个sql和大家分析下原因:sql ...
- 当执行计划中出现BITMAP CONVERSION TO ROWIDS关键字时,需要注意了。
前言 前些天优化了一些耗费buffers较多的SQL,但系统CPU降低的效果不明显,于是又拉了awr报告,查看了SQL ordered by Gets排名前列的SQL. 分析 SQL代码: selec ...
- android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法
android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...
- 转载:安装Ubuntu 15.10后要做的事
转载:安装Ubuntu 15.10后要做的事 原文转载于:http://blog.csdn.net/skykingf/article/details/45267517 Ubuntu 15.10发布了, ...
- 更新到mysql 5.7后解决0000-00-00日期问题
更新到mysql 5.7后解决0000-00-00日期问题 学习了:http://www.07net01.com/2016/04/1479450.html mysql 5.7 默认开始用以下sql m ...
- ajax的content-download时间过慢问题的解决与思考
其次,查看出现延迟问题的业务页面和不出现延迟的业务页面对这一组件的调用区别. 通过对比,也没有发现两个组件有何不同.(故这一奥秘,有兴趣的同学可以联系我一起讨论.....我可以把源码发给你) 经过多次 ...
- 【转载】WampServer图标显示红色后变成橙色怎么解决
WampServer就是Windows Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件. 工具/原料 WampServer 方法/步 ...
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内 ...
- bitmap 内存溢出OOM的解决办法分享
昨天遇到这个问题就是从一个输入流里调用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一个bit ...
随机推荐
- Android 实现倒计时操作
new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { } @Overri ...
- 【软工神话】第四篇(Alpha冲刺)
前言:咳咳,一个多月了,最近忙这忙那,都把这个故事给落下了,昨晚刚回到家,白天得干活,晚上赶紧把这个故事写完,以此纪念自己的软工. 说明:故事中的人物均是化名,故事情节经过些许加工,故事情节并没有针对 ...
- Cesium-知识点(Viewer)
Cesium之Viewer的构造(转自:https://blog.csdn.net/zhy905692718/article/details/78865107) Viewer属于Cesium的控件部分 ...
- 现有项目中集成Flutter
本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的 ...
- 基于pygame实现飞机大战【面向过程】
一.简介 pygame 顶级pygame包 pygame.init - 初始化所有导入的pygame模块 pygame.quit - uninitialize所有pygame模块 pygame.err ...
- ansible部署 lnmp+wordpress
如上,是项目的目录结构. common: 获取阿里云的yum源 mysql: 二进制安装mysql nginx: 编译安装nginx php-fpm:编译安装php-fpm wordpress: 获取 ...
- MySQL中lock tables和unlock tables浅析
MySQL中lock tables和unlock tables浅析 在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...
- Tomcat8-windows不能在本地计算机启动tomcat,有更多的信息,查阅系统事件日志。
tomcat启动不了,也卸载不了. 本人的一个解决方法: 本来jdk和jre是装在g盘的同一个文件夹里的,后来删了他们.再安装的时候jdk安装回原来的地方,jre安装到c盘. 现在需要卸载到他们,重新 ...
- C#核心基础--静态类&部分类
静态类 用 static 关键字修饰的类叫做静态类,静态类通常用来定义工具类.静态类不能实例化,不能从指定基类继承而来,静态类隐式从 Object 类继承而来.静态类只能包含静态成员和常量,因为常量是 ...
- HttpHandler实现网页图片防盗链
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...
