在过去的几天里,我一直在使用Oracle的SQL*Loader来尝试将数据批量加载到Oracle中.在尝试了不同的选项组合后,我惊讶地发现传统的路径负载比直接路径负载运行得快得多.
关于这个问题的一些事实:
使用传统路径,加载在大约6秒内完成.
对于直接路径负载,加载大约需要20分钟.最糟糕的运行需要1.5小时才能完成,但服务器根本不忙.
如果启用了skip_index_maintenance,则直接路径加载将在2-3秒内完成.
我已经尝试了很多选项,但它们都没有给出明显的改进......难以置信,分类索引,多线程(我在多CPU服务器上运行SQL*Loader).他们都没有改善这种情况.
这是在SQL*Loader以直接模式运行期间我一直看到的等待事件:
有没有人知道直接路径加载出了什么问题?或者有什么我可以进一步检查,以真正挖掘问题的根本原因?提前致谢.
在windows xp中,我启动sqlloader.exe将数据加载到Oracle上.这很好用,直到我的密码包含@ -sign,sqlloader参数也使用它来确定要连接的数据库:sqlldr.exe userid/password @ database control = ctrlfile.ctl
如何让sqlldr.exe接受像p @ ssword这样的密码?
我尝试使用单/双引号:sqlldr.exe"user/p @ ssword"@database没有成功.我试图跳过整个用户/密码,在控制台上键入它,但没有成功.
即便谷歌也无法帮助我(虽然它带我进入了伟大的网站).
来自infile的数据格式MM/DD/YYYY如何告诉控制文件将其加载到数据库中YYYYMM?
任何人都能告诉我SQL Loader中Insert和Append语句之间的区别吗?考虑下面的例子:这是我的控制文件
load_1.ctl
load data
infile 'load_1.dat' "str '\r\n'"
insert*/+append/* into table sql_loader_1
(
load_time sysdate,
field_2 position( 1:10),
field_1 position(11:20)
)
Run Code Online (Sandbox Code Playgroud)
这是我的数据文件
load_1.dat
0123456789abcdefghij
**********##########
foo bar
here comes a very long line
and the next is
short
Run Code Online (Sandbox Code Playgroud) 我发现 Oracle 中的 SQL 加载器非常有用、快速且高效。SQL 加载器的 MySQL 等价物是什么?
我正在通过 SQLLDR 将一些数据加载到 Oracle。源文件是“管道分隔”。
FIELDS TERMINATED BY '|'
Run Code Online (Sandbox Code Playgroud)
但有些记录的数据中包含管道字符,而不是作为分隔符。因此,它破坏了记录的正确加载,因为它将indata管道字符理解为字段终止符。
你能给我指出解决这个问题的方向吗?
数据文件约9GB,手动编辑比较困难。
例如,
加载行:
ABC|1234567|STR 9 R 25|98734959,32|2011年12月28日
拒绝行:
DE4|2346543|WE| 454|956584,84|2011年11月28日
错误:
Rejected - Error on table HSX, column DATE_N.
ORA-01847: day of month must be between 1 and last day of month
Run Code Online (Sandbox Code Playgroud)
DATE_N 列是最后一列。
我们正在尝试将FastExport创建的文件加载到oracle数据库中.
但是,Float列的导出方式如下:1.47654345670000000000 E010.
如何配置SQL*Loader来导入它.
期望控制脚本看起来像:
OPTIONS(DIRECT=TRUE, ROWS=20000, BINDSIZE=8388608, READSIZE=8388608)
UNRECOVERABLE LOAD DATA
infile 'data/SOME_FILE.csv'
append
INTO TABLE SOME_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols (
FLOAT_VALUE CHAR(38) "???????????????????",
FILED02 CHAR(5) "TRIM(:FILED02)",
FILED03 TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF6",
FILED04 CHAR(38)
)
Run Code Online (Sandbox Code Playgroud)
我试过了 to_number('1.47654345670000000000 E010', '9.99999999999999999999 EEEE')
错误:
ORA-01481: invalid number format model错误.
我试过了 to_number('1.47654345670000000000 E010', '9.99999999999999999999EEEE')
错误:
ORA-01722: invalid number
这些是我按照优先顺序提出的解决方案:
to_number(replace('1.47654345670000000000 E010', ' ', ''))to_number(TRANSLATE('1.47654345670000000000 E010', '1 ', '1'))我想知道是否有更好的解决方案.
我试着用SQL loader.The的是表必须为空的数据loading.Is有什么办法可以做到数据上传不截断table.The CSV数据需要在table.i要追加正在使用Oracle 11g.
考虑以下情况:
表 T1 (f1, f2, f3);
数据文件:
a|b|c|d
w|x|y|z
Run Code Online (Sandbox Code Playgroud)
我想加载跳过第二个字段的数据,如下所示:
f1 f2 f3
--- --- ---
a d c
w z y
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助或构建控制文件中的任何指针来实现此目的.
目前我的控制文件如下:
Load data
Infile '/.../../emp*.txt'
Append into table emp_load
When (emp_id <> 'emp_id')
Fields terminated by "," optionally enclosed by ' " '
Trailing nullcols
(Emp_id "TRIM(:EMP_ID)",
EMP_NAME "TRIM(:EMP_NAME)",
SAL "TRIM(:SAL)"
)
Run Code Online (Sandbox Code Playgroud)
当前输入文件:
Emp_id,emp_name,sal
1,A,100
2,B,200
Run Code Online (Sandbox Code Playgroud)
我现在有另一个要求,其中输入文件将包含 2 个标头,并且类似于
/folder1/folder2/file1_<date>.csv
Emp_id,emp_name,sal
1,A, 100
2,B,200
...
Run Code Online (Sandbox Code Playgroud)
同样,我将有多个输入文件......
您能帮我处理这种情况的控制文件吗?
sql-loader ×10
oracle ×6
sql ×3
oracle11g ×2
controls ×1
data-import ×1
file ×1
mysql ×1
oracle11gr2 ×1
passwords ×1
performance ×1