oracle sql 查询我使用自已写的函数查询很快,加了函数做条件就很慢是为什么?
如:selecta,b,test(a)cfromdemo;--只这样查很快selecta,b,test(a)cfromdemowheretest(a)like'%123%...
如:select a,b, test(a) c from demo; --只这样查很快
select a,b,test(a)c from demo where test(a) like '%123%'; --这样就很慢
记录只有几十万条记录左右 展开
select a,b,test(a)c from demo where test(a) like '%123%'; --这样就很慢
记录只有几十万条记录左右 展开
7个回答
推荐于2018-04-11
展开全部
慢是因为
对于 几十万条记录左右,
你那个 test(a) 函数, 需要执行 很多次, 每行执行一次, 然后判断 LIKE '%123%'
至于:
select a,b, test(a) c from demo; --只这样查很快
我估计你使用的是 PLSQL Developer。
查询的时候, 默认是查询第一页, 因此很快。
因为只显示少部分行。
例如一页20行的话, 那么也就执行你那个函数 20次。
对于 几十万条记录左右,
你那个 test(a) 函数, 需要执行 很多次, 每行执行一次, 然后判断 LIKE '%123%'
至于:
select a,b, test(a) c from demo; --只这样查很快
我估计你使用的是 PLSQL Developer。
查询的时候, 默认是查询第一页, 因此很快。
因为只显示少部分行。
例如一页20行的话, 那么也就执行你那个函数 20次。
展开全部
因为要遍历比对是否like123啊,前一个sql只是取列数据,直接把相应列读出来就行了。几十万的记录难道还少吗?你可以把sql①语句的结果做个视图,然后在这视图上再做sql②语句,试试是不是快点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加了条件后,不仅要对 test(a) 进行处理 还对 test(a) 进行 遍历 比对 '%123%' 所以肯定会慢的了。
可以想其他办法处理。
比如 test 结果就直接为123的条件
可以想其他办法处理。
比如 test 结果就直接为123的条件
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如上回答中,都有几种方法了,
你的查询可以建立函数索引, CREATE INDEX FIDX_AAA ON DEMO(test(A));
另查询条件如果想用到索引,like条件须写为 like '123%'. 写法'%xxx‘是不会走索引的,即使加了Hint也是full index,数据量多的话应该也不会快
你的查询可以建立函数索引, CREATE INDEX FIDX_AAA ON DEMO(test(A));
另查询条件如果想用到索引,like条件须写为 like '123%'. 写法'%xxx‘是不会走索引的,即使加了Hint也是full index,数据量多的话应该也不会快
追问
索引是有的,只是业务要求是要用like '%%'的
追答
你是指函数索引已经有了吗?加了函数索引如果还是使用like '%%'这样写法也用不到,加了hint也是full index扫描,速度可能会有改善,但不是最理想,
数据库结构,数据存取和应用段的设计应该是要结合的.你可以在应用段把数据存取做部分限制,或在结构设计上作写改变. 几乎没有银行让我们可以一次查10年来的所有的消费记录. 应用段也是可以改的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
like模糊查询的时候 如果是c%会走索引 是%c%或者%c都不会走索引
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询