问题描述
你好,团队,
我们必须从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方法)
希望很快能收到你的回复。
谢谢
卡泰克
我们必须从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行的表:
然后把它卷起来两次。首先使用10的arraysize,然后使用500:
从假脱机文件中获取时间显示:
因此,从10 => 500增加arraysize将查询时间从2.5分钟以上降低到5秒以下!
PS-您的两个脚本似乎都是基于UTL_file的...
例如,如果我创建一个有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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




