2

我有一个棘手的问题。在 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');

与视图/表 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 调用都是硬编码的原因是某些表需要额外的导入信息。

恐怕我不能在这里复制/粘贴原始代码,因为我不知道我是否可以这样做。希望这可以帮助...

4

2 回答 2

2

首先,如果您对要删除的行没有任何条件,则可以截断表。

TRUNCATE TABLE table_1;

TRUNCATE是一个 ddl 操作,它不会物理删除行,它只是操纵高水位线,使操作非常快。但也要记住,它不能回滚,因为它是 DDL。

另一方面,您可以执行直接路径插入,而不是常规插入。试试这个:

INSERT /*+ append */ into table_1 select * from view_1;

这将导致Oracle将数据直接写入高水位线之上,从而使操作更快。如果您的桌子PARALLEL.

于 2012-11-08T14:38:40.607 回答
0

原始代码将执行得更快,因为 Oracle 能够预编译查询,而使用“立即执行”则无法做到这一点。

您的新代码可能看起来更简洁,但实际上更难阅读。至少,与其传递表格编号,不如提供完整的表格名称,否则任何其他查看您的代码的人都必须弄清楚这些数字的含义。

也就是说,我想我更愿意看到 36 个删除语句和 36 个插入语句 - 远不那么神秘,而且更整洁。如果它有助于更​​短的 proc,你可以将所有这些语句放入它们自己的 proc 中。

于 2012-11-08T11:47:29.327 回答