or A.Keyword Like '%英语%' 
or A.Keyword='英语'--这个可以去掉,id需要建索引,其他字段没有关联无需索引,
影响速度的主要原因是order by,你可以用先把数据不排序读进内存(set 或 vector之类),然后再在内存中排序,这是最彻底的解决办法

解决方案 »

  1.   

    先看一下执行计划
    try:
    create index idx_name on A(substr(apath,1,2));
      

  2.   

    楼上的 substr 后面取多少位是不定的1楼,你说的ID建索引,就是直接建嘛?CREATE INDEX i_id_Tablea ON Tablea(id) INDEXTYPE IS CTXSYS.CONTEXT;是用以上的语句?
      

  3.   

    Select A.*,B.Content 
    From TableA A Inner Join Tableb B On A.Id=B.Id 
    Where rownum < 100 
    and SUBSTR(A.apath,1,2)='$-' 
    And (DBMS_LOB.INSTR(B.Content,'英语') > 0 or A.Keyword Like '%英语%' or A.Keyword='英语')
    Order By CLICK Desc以上语句跟order by 应该没有太大关系。建议如下:select a.*,(select Content from b where a.id=b.id)
    from a
    where rownum<100
    and apath like '$-%'
    and keyword like '%英语%'
    Order By CLICK Desc;
    //其中apath 需要单独建立索引//另外根据你写的sql来看,显然你的关键字keyword列没有发挥作用,关键字列就是为了提高查迅速所提取出来的关键词汇,就是为了查询语句中不要用到like '%key%'这样的情况,而你用到的Like '%英语%' 这样的写法显然表示你的关键字没有提取好,如果关键字提取的是确定的一个,那么还可以按照下边的写法会更快:
    select a.*,(select Content from b where a.id=b.id)
    from a
    where rownum<100
    and apath like '$-%'
    and keyword ='英语'
    Order By CLICK Desc;
    //其中建立索引:(keyword,apath)//你的TableA(id,keyword...)按照通常理解,应该是这么记录的
    1   英语数学政治
    2   物理化学
    ...
    建议另外建立一个存放关键字的表c(id,keyword),数据这么存放
    1   英语
    1   数学
    1   政治
    2   物理
    2   化学
    并且在keyword上建立索引,这样做关键字查询时以次为主表,连接其它表选择出需要的数据来才是解决问题的正解
      

  4.   

    查询的原理,WHERE是从下到上,FROM是从最后一个表中查起,所以把数据量小的表放在最后