2010-11-22 310 views
2

场景:甲骨文更新生产数据库

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

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

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

任何建议将不胜感激!

+0

有没有理由不能在开发中加载并从中部署它? – JNK 2010-11-22 17:20:50

回答

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语句在文件中的数据。然后,您可以从外部表选择和数据直接插入到你的“临时”表中,INSERT期间至少做一些编辑:

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

分享和享受。

+0

我已经使用外部表格从CSV文件上传 - 我的集合大约有10万条记录,而且这是一个流畅而无痛的过程。+1 – Sathya 2010-11-22 17:53:19

1

您可以加载数据并将其处理到CERT数据库中。处理完临时表后,将其移至PROD w/export/import(数据泵)或数据库链接。然后将其插入PROD表中。这可以让你做你的数据处理而不会对PROD产生任何影响。插入必须在PROD中完成,为了将影响降至最低,您应该查看插入期间可以禁用/删除的任何触发器/约束/索引,如果您认为这将是一件大事。

2

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

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

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

2

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