自作聪明的开发


近日查看数据库运行较长的语句,发现我们这边的开发人员真是厉害,顺手拈来就是hint。



开发以为只要走索引就是快的,而且刚好知道index hint可以强制走索引,所以就用上了。可是走的是bitmap index full scan,把整个索引都扫描了,然后根据索引的位图转化(bitmap conversion to rowids)成rowid,再根据索引的rowid和表的rowid一一对应,从表中取得数据(table access by index rowid)。

既然是从索引中的所有rowid找到表中的所有的数据,为啥不直接扫描整个表,直接扫描整个表不是更快吗?其实oracle也是很聪明的,我把index  hint去掉之后,走得是全表扫描,这就对了。

读索引是单块读,回表也是单块读。一次的单块读和多块读时间上是差不多的,显然多块读一次扫描的块数更多。

我们把表当成是一本字典,通过拼音检索或者通过部首检索,能够非常快速的定位某一个字在哪页,这就好比是索引扫描,通过索引,能快速定位你检索的数据在表中的位置。

如果我们要找所有的字,假如有1w个字,显然,每一个字都通过检索的方式,我们要找1w次。

如果我们一页一页的找,假设一页有20个字,总共500页,我们要找500次就能找到1w个字。

显然,找500次要比找1w次要快很多。

至于优化的话就简单了,去掉index hint就可以了,如果表大的话就加并行就ok了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值