Oracle 分页查询在子查询中使用了 排序和like 会影响效率吗? 怎样优化呢
像是这样写的。SELECT*FROM(SELECTA.*,RownumrnFROM(SELECT*FROMtb_onewhereid1like'xy%'andnamein...
像是这样写的。
SELECT * FROM (SELECT A.*,Rownum rn FROM
(SELECT * FROM tb_one where
id1 like 'xy%'
and name in (select name from tb_one where id2 like 'xy%')
and to_char(INSTIME,'yyyy-mm-dd hh24:mi:ss')>='2013-1-8 00:00:00'
and to_char(INSTIME,'yyyy-mm-dd hh24:mi:ss')<='2013-1-8 23:59:59' order by INSTIME desc) A
WHERE ROWNUM <=20 ) WHERE rn >=10 ;
解决的话有加分。谢谢各位了
and name in (select name from tb_one where id2 like 'xy%')
这一行的 tb_one 是另外一个表 写错了 ,当作tb_two 就好,like 'xy%' 里面 xy 可能是其他输入的值,比如 ‘ab%’ 展开
SELECT * FROM (SELECT A.*,Rownum rn FROM
(SELECT * FROM tb_one where
id1 like 'xy%'
and name in (select name from tb_one where id2 like 'xy%')
and to_char(INSTIME,'yyyy-mm-dd hh24:mi:ss')>='2013-1-8 00:00:00'
and to_char(INSTIME,'yyyy-mm-dd hh24:mi:ss')<='2013-1-8 23:59:59' order by INSTIME desc) A
WHERE ROWNUM <=20 ) WHERE rn >=10 ;
解决的话有加分。谢谢各位了
and name in (select name from tb_one where id2 like 'xy%')
这一行的 tb_one 是另外一个表 写错了 ,当作tb_two 就好,like 'xy%' 里面 xy 可能是其他输入的值,比如 ‘ab%’ 展开
3个回答
展开全部
1。 看能不能建立索引(和其他几位仁兄一致)
2。 能否不用like 如果tb_one中的id2不是主键也不是索引,可以改为substr(id2,1,2) = 'xy'
3。 排序尽量不要,既然LZ说了这是前提那就省略不说
4。 加hint并行处理(这个会提高不少,但需要数据库开启并行,并且硬件足以支持)
5。 这个肯定是全表扫描,不用想(都like了)
6。 根据你的时间条件,可以写成substr(instime) = '20130108'
7。 加表别名,并不要使用星号
9。 少些几个子查询。。。
2。 能否不用like 如果tb_one中的id2不是主键也不是索引,可以改为substr(id2,1,2) = 'xy'
3。 排序尽量不要,既然LZ说了这是前提那就省略不说
4。 加hint并行处理(这个会提高不少,但需要数据库开启并行,并且硬件足以支持)
5。 这个肯定是全表扫描,不用想(都like了)
6。 根据你的时间条件,可以写成substr(instime) = '20130108'
7。 加表别名,并不要使用星号
9。 少些几个子查询。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果数据量非常大的情况下一般都建立有索引,而like模糊查询是会影响索引的检索效率,所以最好不要用like。
另外写查询语句时尽量避免用select *,一般将需要显示的列select出来就ok
另外写查询语句时尽量避免用select *,一般将需要显示的列select出来就ok
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SELECT * FROM (SELECT A.*,Rownum rn FROM
(SELECT * FROM tb_one where
id1 like 'xy%'
and name in (select name from tb_one where id2 like 'xy%')
and INSTIME>=to_date('2013-1-8 00:00:00','yyyy-mm-dd hh24:mi:ss')
and INSTIME<=to_date('2013-1-8 23:59:59','yyyy-mm-dd hh24:mi:ss') order by INSTIME desc) A
WHERE ROWNUM <=20 ) WHERE rn >=10 ;
name、instime上都要创建索引
(SELECT * FROM tb_one where
id1 like 'xy%'
and name in (select name from tb_one where id2 like 'xy%')
and INSTIME>=to_date('2013-1-8 00:00:00','yyyy-mm-dd hh24:mi:ss')
and INSTIME<=to_date('2013-1-8 23:59:59','yyyy-mm-dd hh24:mi:ss') order by INSTIME desc) A
WHERE ROWNUM <=20 ) WHERE rn >=10 ;
name、instime上都要创建索引
更多追问追答
追问
name索引是创建在tb1 还是tb2呢?另外 like 模糊查询 和 order by 会影响效率吗?
追答
条件中使用的name应该是tb1表里的字段,like和order by肯定会对效率有影响,但是如果你的需求就是这样的话,那就没办法了
如果数据量不太大的话,速度应该可以接受
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询