有一个视图语句如下:CREATE OR REPLACE VIEW VIEW_ASSET_STATE AS
SELECT ASS.ASSET_ID,
       ASS.ASSET_NO,
       ass.setup_date,
       ass.asset_type,
con.SEASON_TEMPLATE_ID,
con.MAINTAIN_TEMPLATE_ID,
con.CHECK_TEMPLATE_ID,
       ass.engine_model,
       RUN.RUN_ID run_state_id ,
       RUN.RUN_NAME,
       spec.asset_spec_name,
       ASS.ASSET_MODEL,
       SPEC.ASSET_TYPE_ID,
       CD.REMARK,
       ASS.BELONG_TO_GROUP,
       dept.dept_id,
       DEPT.DEPT_NAME,
       FUN_GET_ASSET_HOUR(ASS.ASSET_NO) ASSET_HOURS,
       fun_get_asset_czd(ass.ASSET_NO) CZD,
       FUN_GET_ASSET_PRE_HOUR('1', ASS.ASSET_ID) ASSET_PRE_HOUR,
       FUN_GET_ASSET_PRE_DATE('1', ASS.ASSET_ID) ASSET_PRE_DATE,
       FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '1') ASSET_HOUR_CIRCLE,
       FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '2') ASSET_CALENDER_CIRCLE
  FROM ASSET           ASS,
       PMIS.ASSET_SPEC SPEC,
       CODE_DEPT       DEPT,
       CODE_DEF        CD,
       CODE_RUN_STATE  RUN,
       pmis.CODE_MAINTAIN_CONSIGN con
 WHERE CD.CODE_FIELD = '设备类型'
   AND
   ASS.ASSET_SPEC_ID = SPEC.ASSET_SPEC_ID(+)
   AND ASS.DEPT_ID = DEPT.dept_id(+)
   AND ASS.RUN_STATE_ID = RUN.RUN_ID(+)
   AND SPEC.ASSET_TYPE_ID = CD.CODE_ID(+)
   AND SPEC.MAINTAIN_TYPE IS NOT NULL红色部分用的是函数,函数功能大体是根据每行某字段的值查询出其他值,
这样每条记录都要执行函数,当表中记录数多时,速度很慢,
有没有什么好的办法解决???  是否可以把函数替换掉???

解决方案 »

  1.   

    这么多函数呀, ASSET_NO这个字段是什么值呀
      

  2.   


    这样只能把你函数体里面的sql代码贴出来了,大家看下,没有具体函数内容,不好做优化。
      

  3.   


    CREATE OR REPLACE FUNCTION FUN_GET_ASSET_HOUR(VC_ASSET_ID IN VARCHAR2)
      RETURN NUMBER IS
      --获取最新的台时录入
      NMAX_HOUR NUMBER(8,1);
    BEGIN
    --初始值为0
      NMAX_HOUR := 0;
      SELECT  sum(v.SYGS)
        INTO NMAX_HOUR
        FROM PMIS.V_ASSET_TASK v
      
       WHERE  v.CH = replace(VC_ASSET_ID,'-','');
      IF NMAX_HOUR>0 THEN
      RETURN NMAX_HOUR;
      ELSE
      RETURN 0;
      END IF;
     END FUN_GET_ASSET_HOUR;函数的功能是,根据传入的设备号,从另一张表中取出该设备的总台时
      

  4.   

    1.WHERE子句中的连接顺序
      Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
      例如:
      (低效,执行时间156.3秒)
      SELECT …
      FROM EMP E
      WHERE SAL > 50000
      AND JOB = ‘MANAGER’
      AND 25 < (SELECT COUNT(*) FROM EMP
      WHERE MGR=E.EMPNO);
      (高效,执行时间10.6秒)
      SELECT …
      FROM EMP E
      WHERE 25 < (SELECT COUNT(*) FROM EMP
      WHERE MGR=E.EMPNO)
      AND SAL > 50000
      AND JOB = ‘MANAGER’;
    2.使用DECODE函数来减少处理时间
      使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
      例如:
      SELECT COUNT(*),SUM(SAL)
      FROM EMP
      WHERE DEPT_NO = 0020
      AND ENAME LIKE‘SMITH%’;
      SELECT COUNT(*),SUM(SAL)
      FROM EMP
      WHERE DEPT_NO = 0030
      AND ENAME LIKE‘SMITH%’;
      你可以用DECODE函数高效地得到相同结果
      SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,
      COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,
      SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
      SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
      FROM EMP WHERE ENAME LIKE‘SMITH%’;
      类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中