优化你的查询SQL并且优化你的INDEX

解决方案 »

  1.   

    “存储过程如下:”CREATE OR REPLACE procedure RQCZ_GETHZXXLIST
    (p_TYBM in varchar2, p_ZRCBM in varchar2,p_NF in varchar2,p_CURSOR OUT comm_types.comm_cursor) 
    asbegin
            open p_cursor for
            SELECT HZBM_ID, XM, CONVERT_XB_TO_CHAR(XB) AS XB, 
          RQCZ_GETHRKS(p_TYBM, TO_CHAR(HZBM_ID)) AS HRKS, 
          RQCZ_GETCZSF(p_TYBM, TO_CHAR(HZBM_ID), p_NF) AS CZSF --主要是---这个函数影响了速度
    FROM T_FHDJH
    WHERE (TYBM_ID = p_TYBM) AND (SUBSTR(TO_CHAR(HZBM_ID), 1, 2) = p_ZRCBM);end RQCZ_GETHZXXLIST;
      

  2.   

    影响速度的函数如下:CREATE OR REPLACE function RQCZ_GETCZSF
    (p_TYBM in varchar2,p_HZBM in varchar2,p_NF in varchar2) return varchar2 is  Result number;
     
    begin
            select count(*) into Result
             from T_RQCZ
             where p_TYBM = to_char(TYBM_ID) and p_HZBM = to_char(JMBH) and p_NF = to_char(NF);

    if Result = 0 then
    return ('否');
    else return ('是');
    end if ;end RQCZ_GETCZSF;
      

  3.   

    select count(*) into Result
             from T_RQCZ
             where p_TYBM = to_char(TYBM_ID) and p_HZBM = to_char(JMBH) and p_NF = to_char(NF);
    你的T_RQCZ表的字段TYBM_ID,JMBH,NF是什么类型,有无索引。若是字符型,没必要这样写,若是数值型,建议将传入参数改为数值型。
    若字段上有索引,where子句中字段前不能有函数,这样不会利用索引
      

  4.   

    字段类型与参数类型相符,用count(1)就不用全表检索.
    select count(1) into Result
             from T_RQCZ
             where TYBM_ID=p_TYBM  and JMBH=p_HZBM  and NF= p_NF;
      

  5.   

    有COUNT(*),请使用INDEX_FFS同时进行并行处理.
      

  6.   

    TYBM_ID,JMBH,REC_ID好像是索引
      

  7.   

    你这三个字段是什么类型的,若是和传入的参数一个类型,把to_char去掉,若不是,将传入参数改为和这三个字段一个类型的。
    在dba_studio中看索引,或者pl/sql developer也行
      

  8.   

    to cs2002:INDEX_FFS 是快速全索引查询.
    cs2002您是不是CS的高手啊?我可知道你是ORACLE的高手
      

  9.   

    现在按你的方法把类型全部改成number型的了。速度果然快了很多。
    但是现在还是不清楚索引为何物,有什么用?在哪里看?
      

  10.   

    不是不是,见笑了,我很差的,我现在用asp.net开发。谢谢各位的帮助了!
      

  11.   

    select count(*) into Result
      from T_RQCZ
      where p_TYBM = to_char(TYBM_ID) and p_HZBM = to_char(JMBH) and p_NF = to_char(NF);
    改为
    select NVL(MIN(rownum),0) into Result
       from T_RQCZ
       where TYBM_ID=to_number(p_TYBM) and JMBH = to_number(p_HZBM) and NF = to_number(p_NF) and rownum<2;
      

  12.   

    谢谢  Lastdrop(空杯) 了,rownum是什么?
      

  13.   

    rownum是oracle提供的伪列,行号,选出的结果的第一行rownum为1,第100行的rownum为100 ....
      

  14.   

    看来"吴三桂"果然是初学者啊!
    FFS的意思就是使用HINT!
    算了,以后单独告诉你吧.空杯可是高手,多学学吧.