转载:遇到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 ...
随机推荐
- 关于 Socket 设置 setSoTimeout 误用的说明
做网络开发的想必对setSoTimeout这个方法很熟悉,知道是设置的超时事件.但是很多人都认为这个是设置链路的超时时间,但是查看相关文档的此方法的说明: HttpConnectionParams: ...
- 常见js面试题
包含内容: Array indexOf(). 数组扁平化 isArray() 数组的去重 Object.is() Array.filter 用一行代码实现数组扁平化? JavaScript isArr ...
- nodejs+expressjs+ws实现了websocket即时通讯,服务器和客户端互相通信
nodejs代码 // 导入WebSocket模块: const WebSocket = require('ws'); // 引用Server类: const WebSocketServer = We ...
- Java Filter防止sql注入攻击
原理,过滤所有请求中含有非法的字符,例如:, & < select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使用拼接字符串,案例:某个网站的登入验证的SQ ...
- 用ajax对数据进行删除和查看
删除和查看详情操作的共同语句:就是怎么显示表? 1.在主体中写表的开头行,想要显示的内容,并且加载数据也要显示的地方也建张表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 & ...
- Python 对服务器返回数据编码进行判断之chardet
对服务器返回数据编码进行判断之chardet by:授客 QQ:1033553122 测试环境 Win764Bit chardet-2.3.0 下载地址1:https://pypi.pytho ...
- .net webapi 后台导出excel 申请付款单实例
[HttpGet, AllowAnonymous] public void ExportSettlementPrint(string code) { FinSettlementModel settle ...
- mysql 获取一张表中, 另一张表不存在的数据
编写sql语句中,经常需要编写获取一张数据表中不存在与另一张表的数据,相关编写方法如下: 方法1: 使用not in ,效率低下,在数据较小的情况下可以采用如下编写 SELECT * FROM a A ...
- Ext 日期格式化
//日期格式化 Date.prototype.Format = function (fmt) { var o = { , //月份 "d+": this.getDate(), // ...
- 【PHPStorm使用手册】如何设置字体大小?
方案一:鼠标滚轮设置 打开窗口 file -> settings -> Editor -> General, 勾上选项“Change font size(Zoom) with Ctr ...
