博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BITMAP CONVERSION FROM ROWIDS
阅读量:7205 次
发布时间:2019-06-29

本文共 999 字,大约阅读时间需要 3 分钟。

在有些执行计划中,可以会看到 BITMAP CONVERSION FROM ROWIDS这样的东东,也许你会感觉奇怪,我没有使用位图索引怎么出现了bitmap。

我通过一个sql和大家分析下原因:
sql语句为:

SELECT
*
  
FROM
(
SELECT
a.*, ROWNUM rn
          
FROM
SELECT
module_no,
MAX
(id)
AS
id
                    
FROM
vasoa.tab_moa_historypage t
                   
WHERE
t.company_id = :1
AND
t.user_id = :2
AND
t.TYPE = :3
                
GROUP
BY
module_no
                
ORDER
BY
id
DESC
) a
         
WHERE
ROWNUM <= :4) b
WHERE
b.rn >= :5

执行计划为:

表结构为:
目前索引情况:
通过观察执行计划的图片可以发现,使用了 BITMAP CONVERSION FROM ROWIDS,其目的是:.oracle将btree索引中获得的rowid信息通过BITMAP CONVERSION FROM ROWIDS的步骤转换成bitmap进行匹配,然后匹配完成后通过BITMAP CONVERSION TO ROWIDS再转换出rowid获得数据或者回表获得数据。这种想象出现的原因为:oracle的cbo是根据cost来决定大小来选择合适的执行计划,当它计算获得通过bitmap的方式执行的时候cost会更小,它就会选择使用这样的执行计划。一般出现这样的情况,都是因为对表建立的不适当的index导致,特别是对表中的唯一度不高的列建立了index,然后oracle就有可能选择两个这样的列转为为bitmap来执行。根据oracle的执行计划,肯定是cost最小的,但是它很多时候忽略了一致性读等其他条件,导致这个执行计划并非像oracle想象的那样最优,因为把btree index转为为bitmap index执行,需要消耗更多的cpu,特别是在cpu比较紧张的系统中,所以这样的情况如果发生在oltp系统中,一般都需要解决。
本例的解决办法是删除唯一度低的index,建立组合index。分别删除COMPANY_ID与USER_ID上的index,建立COMPANY_ID和USER_ID的组合index,执行计划如下:

 

转载:

你可能感兴趣的文章
每天一个linux命令(26):用SecureCRT来上传和下载
查看>>
7.5 运算符重载
查看>>
把String型的日期 加一天,再变成String型
查看>>
研磨设计模式 之 桥接模式(Bridge)1——跟着cc学设计系列
查看>>
【Android必备】处理Android应用程序链接(15)
查看>>
解决Error:No suitable device found: no device found for connection "Syst
查看>>
Oracle 表空间状态
查看>>
我的友情链接
查看>>
在精准投放方面,百度广告管家能够实现精准投放
查看>>
angular checkbox 全选和反选功能
查看>>
华为认证HCIE专题网站
查看>>
我的友情链接
查看>>
Liunx目录结构
查看>>
配置iSCSI存储多路径
查看>>
我的友情链接
查看>>
iptables_原理理解_DNAT&SNAT实践应用
查看>>
VMware VSphere 虚拟化&云计算学习配置笔记(八)
查看>>
1.8-默认虚拟主机
查看>>
hibernate Unknown entity异常解决方案
查看>>
Java 动态代理
查看>>