暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 与UTL_FILE相比,使用假脱机生成输出文件非常慢

ASKTOM 2019-02-07
357

问题描述

你好,团队,

我们必须从EBS表中提取大量数据。我们尝试了两种方法

方法1 (使用SQL和假脱机命令)
---------
我们已经创建了一个脚本来使用假脱机命令生成输出,但这需要12个小时的时间

方法2 (使用游标、表类型、批量收集 (限制10000) 和Utl_file)
----------
我们创建了一个匿名PLSQL脚本,该脚本使用游标从数据库中获取数据,并将数据放入表类型,然后使用utl_file将数据写入文件。这种方法需要3个小时

驱动表有250百万的数据,从查询的预期计数是2500万。

我的理解是,假脱机命令比utl_file快,但结果在这里有所不同。

我已经在这里附加了两个脚本 (只是将实际的sql更改为虚拟sql,但其余结构相同)。

https://livesql.oracle.com/apex/livesql/s/hxt1psaw8n5b15v09lqj9bpq4(假脱机进近)

https://livesql.oracle.com/apex/livesql/s/hxt1psavb0e5bd5ppd4w5rlsw(UTL_FILE方法)

希望很快能收到你的回复。

谢谢
卡泰克

专家解答

您可能会在SQL * Plus中设置arraysize太小。这决定了它对数据库的每个请求获得多少行。

例如,如果我创建一个有10,000行的表:

create table t as 
  select level c1, lpad ( 'x', 20, 'x' ) c2
  from   dual
  connect by level <= 10000;


然后把它卷起来两次。首先使用10的arraysize,然后使用500:

set termout off
set timing on
spool out.log
set arraysize 10
select * from t;

set arraysize 500
select * from t;
spool off


从假脱机文件中获取时间显示:

10000 rows selected.

Elapsed: 00:02:37.03

...

10000 rows selected.

Elapsed: 00:00:03.77


因此,从10 => 500增加arraysize将查询时间从2.5分钟以上降低到5秒以下!

PS-您的两个脚本似乎都是基于UTL_file的...
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论