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