select * from para_adj p  where p.pn=p.nei_ne_pn (pn 和nei_ne_pn是表para_adj中的字段)
需要pn 和nei_ne_pn同一行的值相同的数据。现在的查询时间要7秒多钟,请问怎样才可以提高查询速度呀?
请各位帮帮忙,多谢!

解决方案 »

  1.   


    把select * from para_adj p  where p.pn=p.nei_ne_pn  中的*换成字段
    select pn,pni_ne_n,  .... from para_adj p  where p.pn=p.nei_ne_pn 
      

  2.   


    /--分别在para_adj表中给pn和nei_ne_pn建立索引,请再查询并希望知道增加索引后的运行时间。create index idx_para_adj1 on para_adj (pn);create index idx_para_adj2 on para_adj (nei_ne_pn);
      

  3.   

    索引建了,也是查询所需要的字段,但是还是慢,我改成这样:
    SELECT p.city_id,p.ne_omc_id,p.cell_name,p.nei_cell_name,p.vendor_name,p.nei_vendor_name,p.pn,p.nei_ne_pn
    FROM  para_adj p  WHERE  1=1 AND  Exists (SELECT 1 FROM para_adj b WHERE p.pn=b.nei_ne_pn) 
    速度是达到了比较理想的值,但是查询结果是不对的。
      

  4.   

    /* A.ID=B.ID 中ID为你的para_adj表中的唯一标识字段  */SELECT A.* FROM para_adj A
    INNER JOIN para_adj B ON A.ID=B.ID
    WHERE  A.pn=B.nei_ne_pn这样速度绝对快...,结帖..给分吧.....  ~..~
      

  5.   

    wanjianjun 你好,谢谢你的帮助,不过我测试了你给的sql,时间还是要7-8秒钟。
      

  6.   

    关键是看你的这个sql查询出了多少条记录,如果记录数少于表记录20%的话,就有优化空间,否则就只能这样了。
      

  7.   

    sql>create index idx_para_adj_2 ON para_adj(pn, nei_ne_pn);sql>exec dbms_stats.gather_table_stats(user, 'para_adj', cascade=>true);sql>select * from para_adj p  where p.pn=p.nei_ne_pn --原来的,看看索引有效不?sql>
    select /*+ use_nl(b, a) */ a.*
      from para_adj A,
         (
    select rowid rid
      from para_adj
     where pn = nei_ne_pn  
         ) B
     where a.rowid = b.rid    
    --看看后面这个结果何。--最好把你的执行计划帖出来
      

  8.   

    索引都建了,数据记录目前有几万条,这是最少的情况。
    我测试过你的sql也要7-8秒钟。(原本:select p.city_id,p.ne_omc_id,p.cell_name,p.nei_cell_name,p.vendor_name,p.nei_vendor_name
      from para_adj p where p.pn=p.nei_ne_pn)
    也许真的没办法啦。
      

  9.   

    codearts:我就一个表,现有2万多条数据,这两万多条数据中没有符合要求的。
      

  10.   

    select * from para_adj p  where p.pn=p.nei_ne_pn 避免求笛卡尔积:
    select * from para_adj p where exist(select * from para_adj j where j.nei_ne_pn=p.pn);
      

  11.   


    create index idx_para_adj_2 ON para_adj(pn, nei_ne_pn); 
    这个复合索引刚好合适,只需要走index fast full scan就可以了。能帖出执行计划不?