sql – Oracle查询在索引号列上使用“like”,性能不佳
在查询1上,正在执行全表扫描,即使id是索引列.查询2实现了相同的结果,但更快.如果查询1运行返回索引列,那么它将快速返回,但如果返回非索引列,或者整个行是查询需要更长时间.
在查询3中,它运行速度很快,但是“代码”列是VARCHAR2(10)而不是NUMBER(12),并且与“id”相同. 为什么Query 1不能拿起它应该使用索引?有什么应该改变,以允许索引号码列执行更快? [查询1] select a1.* from people a1 where a1.id like '119%' and rownum < 5 解释计划 [查询2] select a1.* from people a1,people a2 where a1.id = a2.id and a2.id like '119%' and rownum < 5 解释计划 [查询3] select a1.* from people a1 where a1.code like '119%' and rownum < 5 解释计划 解决方法LIKE pattern-matching condition希望将字符类型视为左侧和右侧操作数.遇到NUMBER时,它会将其隐式转换为char.您的查询1基本上是无声改写为:SELECT a1.* FROM people a1 WHERE TO_CHAR(a1.id) LIKE '119%' AND ROWNUM < 5 这在你的情况下发生,这是不好的2个原因: >对于每一行都执行转换,这是缓慢的; 要解决它,您需要执行以下操作之一: >在A1.ID列上创建一个function-based index: CREATE INDEX people_idx5 ON people(TO_CHAR(id)); 当然,如果您选择根据现有的ID列创建一个附加列,则需要保持这两个列的同步.您可以批量将其作为单个UPDATE或ON-UPDATE触发器,或将该列添加到适当的您的代码中的INSERT和UPDATE语句. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |