【发布时间】:2012-11-08 09:54:53
【问题描述】:
我遇到了一个棘手的问题。在 Oracle 10 中有成对的视图和表,这样的事情会一遍又一遍地完成:
proc_log('DELETE 1');
DELETE FROM table_1;
proc_log('INSERT 1');
INSERT INTO table_1 SELECT * FROM view_1;
proc_log('FINISH 1');
View/Table 2 和 3 和 4 和 5... 和 36 也是如此。
我想做这样的事情:
PROCEDURE proc_import(p_table VARCHAR2) IS
BEGIN
proc_log('DELETE ' || p_table);
EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table;
proc_log('INSERT ' || p_table);
EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table;
proc_log('FINISH || p_table);
COMMIT;
END;
然后调用所有 36 对的函数。
毫不奇怪,这种东西比硬编码的要慢 50%。
我的问题:有没有人知道如何让它更快。或者更好的是,我怎样才能让这些东西与众不同但同样优雅?
编辑
整个东西是这样构建的:
CREATE OR REPLACE PACKAGE PKG_IMPORT IS PROCEDURE proc_log IS BEGIN [funky not important stuff] END; PROCEDURE proc_import IS BEGIN proc_import_table('1', TRUE); proc_import_table('2'); proc_import_table('3'); proc_import_table('4', TRUE); proc_import_table('5'); ... proc_import_table('36'); END; PROCEDURE proc_import(p_table VARCHAR2, p_whole BOOLEAN DEFAULT FALSE) IS BEGIN proc_log('DELETE ' || p_table); IF p_whole THEN EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table; ELSE EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table || ' WHERE business_logic_applies'; END IF; proc_log('INSERT ' || p_table); EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table; proc_log('FINISH || p_table); COMMIT; END; END PKG_IMPORT;
过程 proc_import 每晚被作业调用一次。所有 proc_import_table 调用都是硬编码的原因是某些表需要额外的导入信息。
恐怕我不能在这里复制/粘贴原始代码,因为我不知道我是否可以这样做。希望这会有所帮助...
【问题讨论】:
-
完整地写出来。您仍然需要拨打
proc_import36 次。这不是您问题的答案,但听起来您的数据库结构有问题。 -
这里似乎不太对劲。如果这是一项夜间工作,并且截断/附加帮助性能,那么我认为运行它需要几秒钟以上的时间。但如果运行时间超过几秒钟,您应该不会注意到使用动态 SQL 几十次的开销所带来的任何差异。也许您应该多运行几次测试,也许是其他一些因素导致了性能差异。
标签: oracle plsql oracle10g execute-immediate