【问题标题】:Oracle update production databaseOracle 更新生产数据库
【发布时间】:2012-05-01 22:21:18
【问题描述】:

场景:

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

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

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

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

【问题讨论】:

  • 有什么原因你不能在开发中加载它并从那里部署它?

标签: sql oracle production-environment


【解决方案1】:

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

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

分享和享受。

【讨论】:

  • 我使用外部表从 CSV 文件上传 - 我的设置大约有 100k 条记录,这是一个平稳、轻松的过程。 +1
  • +1,尽管不相信这比 SQL*Loader 更有效/性能更好。
  • 您不能像在 sqlldr 中那样在外部文件中进行尽可能多的处理(在字段上使用 SQL 以特定方式对其进行更新),但如果您尝试使用更少的磁盘,这是一个不错的选择在您的任何步骤上,特别是如果这些需要更多临时表。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以将数据加载到 CERT 数据库中并进行处理。处理完临时表后,将其移至带有导出/导入(数据泵)或通过数据库链接的 PROD。然后插入到 PROD 表中。这将使您在不影响 PROD 的情况下进行数据处理。插入必须在 PROD 中完成,为了尽量减少影响,如果您认为这很重要,您应该查看在插入期间可以禁用/删除的任何触发器/约束/索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-24
        • 2016-09-19
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2017-06-08
        相关资源
        最近更新 更多