代码之家  ›  专栏  ›  技术社区  ›  Andrei Ciobanu

Oracle更新生产数据库

  •  2
  • Andrei Ciobanu  · 技术社区  · 14 年前

    脚本:

    • 我有一个巨大的.csv文件(百万行)。
    • sqlldr (SQL Loader)我必须创建一个包含CSV中所有数据的临时表。
    • 在这之后,我必须对临时表做一些处理(大写更新一些列等)。
    • 在处理之后,我必须从临时表中提取每一行,进行一些额外的检查,并将这些行插入到另一个表中(在生产中大量使用)。

    您建议如何进行所有这些处理,以便我不会影响生产环境的总体性能?

    (注意:我不应该事先处理.csv)。

    任何建议将不胜感激!

    4 回复  |  直到 13 年前
        1
  •  10
  •   Bob Jarvis - Слава Україні    14 年前

    我知道你说过你想使用SQL Loader,但是你可能想看看使用一个外部表,因为它可以使事情变得更简单。您可以将外部表声明为

    create table EXTERNAL_HR_DATA (
        EMPNO    NUMBER(4),
        ENAME    VARCHAR2(10),
        JOB      VARCHAR2(9),
        MGR      NUMBER(4),
        HIREDATE DATE,
        SAL      NUMBER(7,2),
        COMM     NUMBER(7,2),
        DEPTNO   NUMBER(2))
        Organization external
            (type oracle_loader
             default directory testdir
             access parameters (records delimited by newline
                                fields terminated by ‘,’)
             location (‘emp_ext.csv’))
        reject limit 1000;
    

    这将允许您使用标准的SELECT语句读取(但不更改)文件中的数据。然后,您可以从外部表中进行选择,并将数据直接插入“temp”表中,在插入过程中至少执行一些编辑:

    INSERT INTO TEMP_HR_DATA
      SELECT EMPNO,
             UPPER(TRIM(ENAME)),
             UPPER(TRIM(JOB)),
             MGR,
             HIREDATE,
             SAL,
             COMM,
             DEPTNO
        FROM EXTERNAL_HR_DATA;
    

    分享和享受。

        2
  •  2
  •   Martin Schapendonk    14 年前

    检查您的数据库是否有足够的磁盘空间,并且在RAM/CPU上不会太紧张。

    如果可以的话:就做吧。一百万行并不壮观。将文件加载到工作表中听起来不像是会影响生产性能的事情。可以在sqlldr控制文件中执行to_upper()(在工作表中保存更新)。也许在加载时可以进行更多的后处理?

    外部表(如另一个答案中所建议的)也可以正常工作,但除了节省一些磁盘空间之外,它没有其他优势,同时它确实给配置带来了一些额外的麻烦(创建目录、授予访问权限、将文件传输到db server)。

        3
  •  2
  •   Mike Meyers    14 年前

    在加载文件时,实际上可以在SQL*Loader中进行一些后期处理。这可能会减少数据库上的一些负载,因为更新临时表可能很慢,并且会创建大量的redo/undo/whatever。

        4
  •  1
  •   brycesub    14 年前

    您可以加载数据并将其处理到CERT数据库中。处理完临时表后,将其移动到PROD w/export/import(datapump)或通过数据库链接。然后插入到PROD表中。这将允许您在不影响PROD的情况下进行数据处理。插入操作必须在PROD中完成,为了将影响降到最低,您应该查看在插入过程中可以禁用/删除的任何触发器/约束/索引(如果您认为这将是一件大事)。