oracle sql 查询我使用自已写的函数查询很快,加了函数做条件就很慢是为什么?

如:select a,b, test(a) c from demo; --只这样查很快
select a,b,test(a)c from demo where test(a) like '%123%'; --这样就很慢
记录只有几十万条记录左右

慢是因为
对于 几十万条记录左右,
你那个 test(a) 函数, 需要执行 很多次, 每行执行一次, 然后判断 LIKE '%123%'

至于:
select a,b, test(a) c from demo; --只这样查很快

我估计你使用的是 PLSQL Developer。
查询的时候, 默认是查询第一页, 因此很快。
因为只显示少部分行。
例如一页20行的话, 那么也就执行你那个函数 20次。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-24
因为要遍历比对是否like123啊,前一个sql只是取列数据,直接把相应列读出来就行了。几十万的记录难道还少吗?你可以把sql①语句的结果做个视图,然后在这视图上再做sql②语句,试试是不是快点
第2个回答  2013-05-24
加了条件后,不仅要对 test(a) 进行处理 还对 test(a) 进行 遍历 比对 '%123%' 所以肯定会慢的了。
可以想其他办法处理。
比如 test 结果就直接为123的条件本回答被提问者和网友采纳
第3个回答  2013-05-24
如上回答中,都有几种方法了,
你的查询可以建立函数索引, CREATE INDEX FIDX_AAA ON DEMO(test(A));
另查询条件如果想用到索引,like条件须写为 like '123%'. 写法'%xxx‘是不会走索引的,即使加了Hint也是full index,数据量多的话应该也不会快追问

索引是有的,只是业务要求是要用like '%%'的

追答

你是指函数索引已经有了吗?加了函数索引如果还是使用like '%%'这样写法也用不到,加了hint也是full index扫描,速度可能会有改善,但不是最理想,

数据库结构,数据存取和应用段的设计应该是要结合的.你可以在应用段把数据存取做部分限制,或在结构设计上作写改变. 几乎没有银行让我们可以一次查10年来的所有的消费记录. 应用段也是可以改的.

第4个回答  2013-05-24
like模糊查询的时候 如果是c%会走索引 是%c%或者%c都不会走索引
相似回答