简体   繁体   English

提高CURSOR FOR LOOP的效率

[英]Improving efficiency of CURSOR FOR LOOP

I have two CURSOR FOR LOOPS, one to find AVG(USAGE) on public holidays, the other to find AVG(USAGE) on ordinary days. 我有两个游标,一个是在公共假期查找AVG(USAGE),另一个是在平日查找AVG(USAGE)。 Info retrieved from these is written into another table. 从这些数据库中检索到的信息将写入另一个表中。 It runs rather slowly, and I'm sure there must be a way to improve efficiency, but I'm still pretty new at this and I suspect my code is clunky, at best. 它运行得很慢,我确定必须有一种提高效率的方法,但是我仍然很新,我怀疑我的代码充其量是笨拙的。

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;

Now, at the moment, it's running both CURSOR FOR loops regardless of whether the day is a public holiday or not. 现在,无论一天是否是公共假期,它都同时运行两个CURSOR FOR循环。 I'm sure there's a way to structure my select statement(s) so that this isn't necessary, but it's beyond me at the moment. 我敢肯定,有一种方法可以构造我的select语句,这样就没有必要了,但此刻超出了我的范围。 Secondly, I suspect the Public Holiday is returning too much information, but that may just be because there are a lot of public holidays in the next week here in Aus. 其次,我怀疑公共假日返回的信息太多,但这可能只是因为下周在澳大利亚有很多公共假日。

I modify your query, however you have to check it. 我修改了您的查询,但是您必须检查它。

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