标签: sql-loader

以直接模式运行的Oracle SQL*加载程序比传统路径加载慢得多

在过去的几天里,我一直在使用Oracle的SQL*Loader来尝试将数据批量加载到Oracle中.在尝试了不同的选项组合后,我惊讶地发现传统的路径负载比直接路径负载运行得快得多.

关于这个问题的一些事实:

  • 要加载的记录数为60K.
  • 加载前,目标表中的记录数为7亿.
  • Oracle版本是11g r2.
  • 数据文件包含日期,字符(ascii,无需转换),整数,浮点数.没有blob/clob.
  • 表由哈希分区.散列函数与PK相同.
  • 表的并行设置为4,而服务器有16个CPU.
  • 索引是本地分区的.索引的并行(来自ALL_INDEXES)是1.
  • 目标表上只有1个PK和1个索引.使用索引构建PK约束.
  • 检查索引分区显示分区之间的记录分布非常均匀.
  • 数据文件是分隔的.
  • 使用APPEND选项.
  • 通过SQL选择和删除加载的数据非常快,几乎是即时响应.

使用传统路径,加载在大约6秒内完成.

对于直接路径负载,加载大约需要20分钟.最糟糕的运行需要1.5小时才能完成,但服务器根本不忙.

如果启用了skip_index_maintenance,则直接路径加载将在2-3秒内完成.

我已经尝试了很多选项,但它们都没有给出明显的改进......难以置信,分类索引,多线程(我在多CPU服务器上运行SQL*Loader).他们都没有改善这种情况.

这是在SQL*Loader以直接模式运行期间我一直看到的等待事件:

  • 事件:db文件顺序读取
  • P1/2/3:文件#,块#,块(从dba_extents检查它是一个索引块)
  • 等待类:用户I/O.

有没有人知道直接路径加载出了什么问题?或者有什么我可以进一步检查,以真正挖掘问题的根本原因?提前致谢.

oracle performance sql-loader

5
推荐指数
1
解决办法
7869
查看次数

SQLLoader,密码包含@ -signs

在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没有成功.我试图跳过整个用户/密码,在控制台上键入它,但没有成功.

即便谷歌也无法帮助我(虽然它带我进入了伟大的网站).

passwords sql-loader

4
推荐指数
2
解决办法
5756
查看次数

使用SQL*Loader控制文件将日期从一种格式转换为另一种格式

来自infile的数据格式MM/DD/YYYY如何告诉控制文件将其加载到数据库中YYYYMM

sql oracle sql-loader

4
推荐指数
1
解决办法
3万
查看次数

SQL Loader中Insert和Append语句之间的区别?

任何人都能告诉我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-loader

4
推荐指数
1
解决办法
5万
查看次数

相当于 MySQL 中的 SQL 加载器

我发现 Oracle 中的 SQL 加载器非常有用、快速且高效。SQL 加载器的 MySQL 等价物是什么?

mysql sql sql-loader

4
推荐指数
1
解决办法
8887
查看次数

SQL*Loader:处理数据中的分隔符

我正在通过 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 列是最后一列。

oracle oracle11gr2 sql-loader

4
推荐指数
1
解决办法
1万
查看次数

如何从Oracle SQL中的科学记数法转换?

我们正在尝试将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


这些是我按照优先顺序提出的解决方案:

  1. to_number(replace('1.47654345670000000000 E010', ' ', ''))
  2. to_number(TRANSLATE('1.47654345670000000000 E010', '1 ', '1'))

我想知道是否有更好的解决方案.

sql oracle sql-loader

4
推荐指数
2
解决办法
3万
查看次数

从命令行将数据从csv文件加载到oracle表

我试着用SQL loader.The的是表必须为空的数据loading.Is有什么办法可以做到数据上传不截断table.The CSV数据需要在table.i要追加正在使用Oracle 11g.

oracle data-import oracle11g sql-loader

4
推荐指数
1
解决办法
2万
查看次数

使用SQLLDR加载分隔数据时删除数据字段

考虑以下情况:

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)

非常感谢您的帮助或构建控制文件中的任何指针来实现此目的.

oracle11g plsqldeveloper sql-loader

4
推荐指数
1
解决办法
4万
查看次数

使用 sql 加载器加载表时跳过前 2 行

目前我的控制文件如下:

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)

同样,我将有多个输入文件......

您能帮我处理这种情况的控制文件吗?

controls file sql-loader

4
推荐指数
1
解决办法
2万
查看次数