[英]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.