繁体   English   中英

提高CURSOR FOR LOOP的效率

[英]Improving efficiency of CURSOR FOR LOOP

我有两个游标,一个是在公共假期查找AVG(USAGE),另一个是在平日查找AVG(USAGE)。 从这些数据库中检索到的信息将写入另一个表中。 它运行得很慢,我确定必须有一种提高效率的方法,但是我仍然很新,我怀疑我的代码充其量是笨拙的。

create or replace PROCEDURE USAGE_FORECAST AS
  v_dayNumber NUMBER;  
  v_halfHour NUMBER;

  CURSOR c_nonPublicHoliday is
    SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
      FROM INITIAL_TABLE, HOLIDAY_TABLE
      WHERE (to_char(day, 'd') = v_dayNumber
             OR to_char(day, 'd') = v_dayNumber-7)
            AND INITIAL_TABLE.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)
            AND HH = v_halfHour
      GROUP BY STREET, SUBURB, DAY, HH;

  CURSOR c_publicHoliday is
    SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
      FROM INITIAL_TABLE, HOLIDAY_TABLE
      WHERE V_NEM_RM16.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)
            AND HH = v_halfHour
      GROUP BY STREET, SUBURB, DAY, HH;                             

BEGIN
  FOR v_forecastDay IN 1..7 LOOP
    v_dayNumber := v_forecastDay;

    FOR v_halfHourInterval IN 1..48 LOOP
      v_halfHour := v_halfHourInterval;

      FOR R1 IN c_nonPublicHoliday LOOP
        INSERT INTO LOCAL_TABLE
          (STREET,    SUBURB,    DAY,     HH,    USAGE)
        VALUES
          (R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
      END LOOP;

      FOR R1 IN c_PublicHoliday LOOP
        INSERT INTO LOCAL_TABLE
          (STREET,    SUBURB,    DAY,  HH,       USAGE)
        VALUES
          (R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
      END LOOP;
    END LOOP;
  END LOOP;

现在,无论一天是否是公共假期,它都同时运行两个CURSOR FOR循环。 我敢肯定,有一种方法可以构造我的select语句,这样就没有必要了,但此刻超出了我的范围。 其次,我怀疑公共假日返回的信息太多,但这可能只是因为下周在澳大利亚有很多公共假日。

我修改了您的查询,但是您必须检查它。

create or replace PROCEDURE USAGE_FORECAST AS
  v_dayNumber NUMBER;  
  v_halfHour NUMBER;

  CURSOR c_nonPublicHoliday is
    SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
      FROM INITIAL_TABLE, HOLIDAY_TABLE
      WHERE (to_char(day, 'd') = v_dayNumber
             OR to_char(day, 'd') = v_dayNumber-7)
            /*AND INITIAL_TABLE.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)*/
            AND exists (SELECT 1 FROM HOLIDAY_TABLE h where h.HOLIDAY_DATE  = INITIAL_TABLE.DAY )
            AND HH = v_halfHour
      GROUP BY STREET, SUBURB, DAY, HH;

  CURSOR c_publicHoliday is
    SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
      FROM INITIAL_TABLE, HOLIDAY_TABLE
      WHERE /*V_NEM_RM16.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)*/
            exists (SELECT 1  FROM HOLIDAY_TABLE H where H.HOLIDAY_DATE = V_NEM_RM16.DAY)
            AND HH = v_halfHour
      GROUP BY STREET, SUBURB, DAY, HH;                             

BEGIN
  FOR v_forecastDay IN 1..7 LOOP
    v_dayNumber := v_forecastDay;

    FOR v_halfHourInterval IN 1..48 LOOP
      v_halfHour := v_halfHourInterval;

      FOR R1 IN c_nonPublicHoliday LOOP
        INSERT INTO LOCAL_TABLE
          (STREET,    SUBURB,    DAY,     HH,    USAGE)
        VALUES
          (R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
      END LOOP;

      FOR R1 IN c_PublicHoliday LOOP
        INSERT INTO LOCAL_TABLE
          (STREET,    SUBURB,    DAY,  HH,       USAGE)
        VALUES
          (R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
      END LOOP;
    END LOOP;
  END LOOP;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM