Sql 提高循环游标的效率

Sql 提高循环游标的效率,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,我有两个用于循环的光标,一个用于查找公共假日的平均值,另一个用于查找普通日的平均值。从中检索到的信息将写入另一个表中。它运行得相当慢,我相信一定有办法提高效率,但我在这方面还是很新的,我怀疑我的代码最多是笨重的 create or replace PROCEDURE USAGE_FORECAST AS v_dayNumber NUMBER; v_halfHour NUMBER; CURSOR c_nonPublicHoliday is SELECT STREET, SU

我有两个用于循环的光标,一个用于查找公共假日的平均值,另一个用于查找普通日的平均值。从中检索到的信息将写入另一个表中。它运行得相当慢,我相信一定有办法提高效率,但我在这方面还是很新的,我怀疑我的代码最多是笨重的

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;

现在,不管这一天是否是公共假日,它都在运行两个游标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;

这些表上定义了哪些索引?您是否尝试过对游标查询执行解释计划?如果您编辑问题并添加查询中使用的每个表的定义,这也会很有帮助。谢谢。一般来说,逐行处理是没有效率的。查看是否可以将插入项重组为两个插入项。。选择语句。