有一个ADDRESS表,表中大概有2百多万条记录.
这个表建了多个索引,其中有一个是:
CREATE INDEX ADDRESS_PLSQL ON ADDRESS
(LANG_ID, COMPANY_NO, EVENT_ID, DEM_COM_NO, COMPANY_IND, DEFAULT_IND)
我用外面一条sql:
SELECT NVL (city, '')
  FROM ADDRESS
 WHERE LANG_ID = 0
   AND COMPANY_NO  = 51000120
   AND EVENT_ID = 202
   AND DEM_COM_NO = '10112197'
   AND COMPANY_IND = 'T'
   AND DEFAULT_IND = 'T'
它查询1秒都不要!!!而我在一个存储过程用
.......
DBMS_OUTPUT.PUT_LINE('START');
      DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));
      begin
      SELECT NVL(CITY, '')
        INTO v_CITY
        FROM ADDRESS
       WHERE LANG_ID = glangid 
          AND COMPANY_NO = gcompanyno 
          AND EVENT_ID = geventid 
          AND DEM_COM_NO = v_pub_company_no 
          AND COMPANY_IND = 'T' 
          AND DEFAULT_IND = 'T';             
           EXCEPTION
            WHEN OTHERS THEN
            v_CITY:='';
       end;      DBMS_OUTPUT.PUT_LINE('END');
      DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));..........
调用时它显示我用了25秒的时间!!!!!

解决方案 »

  1.   

    NVL(CITY,  '')  没什么用处
    oracle里面 ''=null为where条件中使用的列创建索引
      

  2.   

    WHERE LANG_ID = glangid 
              AND COMPANY_NO = gcompanyno 
              AND EVENT_ID = geventid 
              AND DEM_COM_NO = v_pub_company_no 这里面的glangid是多少呢?gcompanyno又等于多少呢>
    nvl(city,'为空')
      

  3.   

    在这个PL/SQL也是
    LANG_ID = 0
    COMPANY_NO  = 51000120
    EVENT_ID = 202
    DEM_COM_NO = '10112197'

    索引我已经建了
    问题就是同样的SQL,在不同的地方为什么用的时间这么大的差别呢????
      

  4.   

    你把日志跟踪打开,用oracle的分析功能看一下到底时间花在哪里了。
    如果的确是这句话有性能问题,用以下的方法试试
    1.如果没有用到索引的话,可以选重建索引,再把存储过程重建一下。
    2.如果你使用的是CBO(基于代价的优化器),将表重新做一下分析。