Oracle更新生产数据库

时间:2010-11-22 17:03:43

标签: sql oracle production-environment

情景:

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

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

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

任何建议都将受到高度赞赏!

4 个答案:

答案 0 :(得分:10)

我知道您已经说过要使用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语句读取(但不更改)文件中的数据。然后你可以从外部表中选择SELECT并直接将数据插入到'temp'表中,在INSERT期间至少进行一些编辑:

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

分享并享受。

答案 1 :(得分:2)

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

如果没关系:就这样做吧。一百万行并不壮观。将文件加载到工作表中听起来不像通常会影响生产性能的东西。您可以在sqlldr控制文件中执行to_upper()(在工作表上保存更新)。也许在加载时可以进行更多的后期处理?

外部表(在另一个答案中建议)也可以正常工作,但除了节省一些磁盘空间之外没有其它优势,虽然它确实给配置带来了一些额外的麻烦(创建目录,授予访问权限,传输文件到数据库服务器)。

答案 2 :(得分:2)

加载文件时,您实际上可以在SQL * Loader中进行相当多的后处理。这可以减少数据库上的一些负载,因为更新临时表可能很慢并且创建大量重做/撤消/无论如何。

答案 3 :(得分:1)

您可以加载数据并对CERT数据库进行处理。完成临时表处理后,将其移至PROD w / export / import(datapump)或数据库链接。然后插入PROD表。这将使您无需对PROD产生任何影响即可进行数据处理。插入必须在PROD中完成,以最大限度地减少影响,如果您认为这将是一个大问题,您应该查看在插入期间可以禁用/删除的任何触发器/约束/索引。