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