场景:甲骨文更新生产数据库
- 我有一个巨大的.csv文件(行万美元)。
- With
sqlldr
(SQL Loader)我必须创建一个包含CSV中所有数据的临时表。 - 之后,我必须对临时表进行一些处理(大写更新某些列等)。
- 处理完后,我必须从临时表中取出每一行,进行一些额外的检查并将这些行插入到另一个表中(在生产中大量使用)。
您如何建议进行所有这些处理,以便我不会影响生产环境的整体性能?
(注意:我不应该预先处理.csv)。
任何建议将不胜感激!
场景:甲骨文更新生产数据库
sqlldr
(SQL Loader)我必须创建一个包含CSV中所有数据的临时表。您如何建议进行所有这些处理,以便我不会影响生产环境的整体性能?
(注意:我不应该预先处理.csv)。
任何建议将不胜感激!
我知道你已经说过你想使用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;
分享和享受。
我已经使用外部表格从CSV文件上传 - 我的集合大约有10万条记录,而且这是一个流畅而无痛的过程。+1 – Sathya 2010-11-22 17:53:19
您可以加载数据并将其处理到CERT数据库中。处理完临时表后,将其移至PROD w/export/import(数据泵)或数据库链接。然后将其插入PROD表中。这可以让你做你的数据处理而不会对PROD产生任何影响。插入必须在PROD中完成,为了将影响降至最低,您应该查看插入期间可以禁用/删除的任何触发器/约束/索引,如果您认为这将是一件大事。
检查您的数据库是否有足够的磁盘空间,并且不要太紧张的RAM/CPU。
如果没问题:就这样做。一百万行不是壮观的。将文件加载到工作表中听起来并不像通常会影响生产性能的东西。您可以在sqlldr控制文件中执行to_upper()(在工作表上保存更新)。也许在加载时可以做更多的后期处理?
一个外部表(正如其他答案中建议的那样)也可以正常工作,但是除保存一些磁盘空间外,没有其他优势,但它确实给配置带来了额外的麻烦(创建目录,授予访问权限,传输文件到数据库服务器)。
加载文件时,您实际上可以在SQL * Loader中进行一些公平的后处理。这可以减少数据库上的一些负载,因为更新临时表可能会很慢,并会创建大量的重做/撤消/无论如何。
有没有理由不能在开发中加载并从中部署它? – JNK 2010-11-22 17:20:50