情景:
sqlldr
(SQL Loader)我必须创建一个包含CSV中所有数据的临时表。您如何建议进行所有这些处理,以便我不会影响生产环境的整体性能?
(注意:我不应该预先处理.csv)。
任何建议都将受到高度赞赏!
答案 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中完成,以最大限度地减少影响,如果您认为这将是一个大问题,您应该查看在插入期间可以禁用/删除的任何触发器/约束/索引。