最近给一家公司做一个oracle数据库的检索功能select count(*) as zs,su.subjectname from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su,ISTIC_Data_CSTPCD_Citation ci
where ar.xk=su.SUBJECTCODE and ar.pdfurl=ci.zz1 
group by su.subjectname 相信大家对这个sql语句并不陌生吧,该语句是三个表的连接查询,三个表的数据量分别为3405497,53,7727297。
其实我一开始只是对前两个表做连接查询,大概用了七秒钟就出现了结果。但是当将第三个表也连接上的时候,这个sql语句整整运行了一天也没运行出结果,我知道肯定很慢,但没想到会这么慢,希望各位高手指点,如何能过提高该sql语句的执行效率!

解决方案 »

  1.   

    给ar.pdfurl,ci.zz1 
    这两个字段建个索引试试
      

  2.   


    select count(*) as zs,su.subjectname from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su,ISTIC_Data_CSTPCD_Citation ci
    where ar.pdfurl=ci.zz1 and ar.xk=su.SUBJECTCODE
    group by su.subjectname 试试
      

  3.   

    数据量太大造成的WITH t1 AS ( SELECT * from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su WHERE    ar.xk=su.SUBJECTCODE )
    select count(*) as zs,t1.subjectname FROM ISTIC_Data_CSTPCD_Citation ci ,t1
    WHERE t1.pdfurl=ci.zz1 
    group by t1.subjectname 
      

  4.   

    是不是数据块老化了。把表移动到新的块,把索引重建,触发器重编译,再试试。
    Alter table table_name move;
    Alter index index_name rebuild;
    Alter trigger trigger_name compare;
      

  5.   

    3个表先后顺序:数据量最大->数据量次之->数据量最小 排列
    查询条件把能过滤掉大量数据的条件放最后
    简言之,多表连接表顺序从多到少,where条件 按过滤量从少到多
      

  6.   

    你的没有过滤条件 所以 只有试试表按数据量排列ci,ar,su试试 应该有提高 不过不会太多