2
回答
oracle中instr真比like快吗?

总是看到有人说instr比like快。因为like有'%xx%'用不到索引的情况,而instr是效率稳定的,只要有索引始终都在用。那么看我下面的语句:

select t.productId,
       t.productname,
       t.productstatus_Id,
       t.dcName,
       t.storeauditqty,
       t.weekDaySaleQuantity,
       t.monthDaySaleQuantity,
       t.inventoryVolume,
       t.recommendQuantity,
       t.storeQuantity,
       t.regionQuantity,
       t.lineTotalPrice,
       dc.InventoryVolume     as dcInventory,
       b.userid               as ba_userid
  from T_BIZ_STORESALESTOCK_Replenish dc,
       t_biz_replenishorderdetail     t,
       t_biz_userdatagroup            b
 where ((b.leveltwoid = 0 and b.leveloneid = t.leveloneid) or
       (b.leveltwoid > 0 and b.leveltwoid = t.leveltwoid))
   and t.status < 3
   and b.userid = 62637
   and t.regionid = 'QSZHS'
   and dc.orgid = t.dcid
   and dc.productid = t.productid
   and instr(dc.orgid, 'D') > 0
-- and dc.orgid like '%D%'

执行计划:

注意:instr时耗费为4114

还是那句SQL,最后改为:

--    and instr(dc.orgid, 'D') > 0
and dc.orgid like '%D%'

看执行计划:

请注意:like时耗费为3771

好吧,谁给个解释。果断@宏哥 ,嘿嘿

举报
sxgkwei
发帖于5年前 2回/6K+阅
共有2个答案 最后回答: 5年前

我猜想大概是因为,instr函数有可选参数,函数里面肯定要if...else判断可选参数传了没有,返回值还分几类,这些都要根据不同情况来if...else判断,返回值也不是boolean,而是整数,也就是说得到了结果还要去跟0对比。

而like运算符,只是机械的逐一扫描,然后直接返回boolean型。

--- 共有 1 条评论 ---
sxgkwei至于它怎么做,我还不关心。只是最重要的一点,网上看到很多说like %xx%这样的查询,是用不到索引的,如果真用不到,那肯定是instr快,可是明显用到了啊 5年前 回复

我靠,刚才做了个测试,发现:

如果是一个组合索引,like的是组合索引的第一个键,like会使用index full scan,而instr却是table full scan。

难怪别人说如果某个字段经常like '%关键字%',可以建立一个组合索引 on(字段,0),这样就会使用index full scan了。

--- 共有 1 条评论 ---
sxgkwei哎,这个就不知道了,不过刚才我那项目又遇到一坑爹的事情。32位的oracle不给力,他们就换成了64位的,而上面的所有东西,包括用户都是直接从32位上导过去的。结果呢,之前代码里写的instr速度杠杠的快,项目在64位上一跑,擦擦擦,慢的像龟爬,一查就是instr的问题,like都能秒出,这个instr就是要1分钟。什么都没改吖,就升级了下数据库。 5年前 回复
顶部