【发布时间】:2018-08-02 01:53:05
【问题描述】:
我有一个存储过程,它插入和(组合)需要几个小时才能运行。我注意到,当我拆分存储过程时(1)小时、日、周 2)月、年);这两个存储过程完成运行的速度比在一个庞大的存储过程中运行要快得多。在第一个过程结束后运行第二个存储过程的最佳解决方案是什么?我在网上寻找解决方案无济于事。我也不认为触发器会起作用,因为这些“内部大小写”存储过程中的每一个都旨在处理数百个插入。以下是我的(淡化)代码:提前致谢!
另外:如果我可以对我的代码进行任何其他改进,欢迎任何/所有反馈:)
原始代码:
create or replace PROCEDURE STORED_PROCEDURE_COMBINED
is
CURSOR hour IS
SELECT distinct HOUR as HOUR
FROM TABLE
WHERE FLAG = 0;
CURSOR day is
SELECT distinct day as day
FROM TABLE
WHERE FLAG = 0;
l_hr hour%ROWTYPE;
l_day days%ROWTYPE;
INSERT_HOUR(l_hr.hour);
INSERT_DAY(l_day.day);
INSERT_WEEK(l_day.day);
INSERT_MONTH(l_day.day);
INSERT_YEAR(l_day.day);
END STORED_PROCEDURE_COMBINED;
我想要什么:
create or replace PROCEDURE STORED_PROCEDURE_1
is
CURSOR hour IS
SELECT distinct HOUR as HOUR
FROM TABLE
WHERE FLAG = 0;
CURSOR day is
SELECT distinct day as day
FROM TABLE
WHERE FLAG = 0;
l_hr hour%ROWTYPE;
l_day days%ROWTYPE;
INSERT_HOUR(l_hr.hour);
INSERT_DAY(l_day.day);
INSERT_WEEK(l_day.day);
END STORED_PROCEDURE_1;
上面的程序在完成后启动下面的程序:
create or replace PROCEDURE STORED_PROCEDURE_2
is
CURSOR day is
SELECT distinct day as day
FROM TABLE
WHERE FLAG = 0;
l_day days%ROWTYPE;
INSERT_MONTH(l_day.day);
INSERT_YEAR(l_day.day);
END STORED_PROCEDURE_2;
【问题讨论】:
-
为什么第一个过程不能在结束前调用第二个?我不确定为什么拆分会更快,因为它所做的工作完全相同;除非您的组合实际上重复的次数比您意外的要多得多,或者您只是偶然修复的其他内容。您还没有显示实际的光标循环,所以不是很清楚。
-
同意亚历克斯。你确定你只是没有在每次迭代另一个光标时重复你的一个光标吗?你还需要一个光标吗?是否有一套基于集合的方式来做你需要做的事情?
-
我也不确定。也许我在重复光标。但在这种情况下,我设置了一个复杂的系统,光标在任何时间(或一天)都可以拾取;将该小时四舍五入到最近的周/月/年(在日报完成后),并将它们作为参数插入到“内部大小写”存储过程中的 where 子句中(如果有意义的话)。