我有54,061,487条记录的直接加载插入。我在寻找速度。我根本不需要回滚。
所有涉及的表都设置为NOLOGGING。
有一种方法可以做到这一点
EXECUTE IMMEDIATE 'TRUNCATE TABLE meRegionsNow';
...
INSERT /*+ APPEND */ INTO meRegionsNow(
carrierId ,
region ,
zip ,
side ,
subPlanTypeId ,
monthIn )
SELECT
r.carrierId as carrierId ,
r.region as region ,
r.zip as zip ,
r.side as side ,
r.subPlanTypeId as subPlanTypeId ,
t.monthIn as monthIn
FROM
meTimeline t
INNER JOIN region r
ON t.monthIn >= r.effective AND
t.monthIn <= r.expiry;此操作的执行计划与预期一致(使用正确的索引来加速连接):
Statement Id=5336 Type=
Cost=2.64022111505165E-308 TimeStamp=25-10-11::15::35:08
(1) SELECT STATEMENT ALL_ROWS
Est. Rows: 5,667 Cost: 483
(5) TABLE TABLE ACCESS BY INDEX ROWID SCHEMA.REGION [Analyzed]
(5) Blocks: 2,826 Est. Rows: 944 of 377,779 Cost: 80
Tablespace: USERS
(4) NESTED LOOPS
Est. Rows: 5,667 Cost: 483
(2) INDEX INDEX FULL SCAN SCHEMA.METL$MONTHIN [Analyzed]
Est. Rows: 6 Cost: 1
(3) INDEX INDEX RANGE SCAN SCHEMA.RGN$MULTI3 [Analyzed]
Est. Rows: 944 Cost: 72 这是另一种方法:
EXECUTE IMMEDIATE 'TRUNCATE TABLE meRegionsNow';
...
DECLARE
CURSOR meTimeline_cur IS
SELECT monthIn
FROM meTimeline
ORDER BY monthIn;
BEGIN
FOR meTimeline_rec IN meTimeline_cur LOOP
/* Cross regions with timeline */
INSERT /*+ APPEND */ INTO meRegionsNow(
carrierId ,
region ,
zip ,
side ,
subPlanTypeId ,
monthIn )
SELECT
r.carrierId as carrierId ,
r.region as region ,
r.zip as zip ,
r.side as side ,
r.subPlanTypeId as subPlanTypeId ,
meTimeline_rec.monthIn as monthIn
FROM region r
WHERE
meTimeline_rec.monthIn >= r.effective AND
meTimeline_rec.monthIn <= r.expiry;
COMMIT;
END LOOP;
END;最快的方法是什么?我不认为游标控制的直接load insert和直接SQL直接load insert有太大区别。
再说一次,我不关心日志记录、回滚、保留任何撤消数据。我怀疑这花费很长时间的原因是表空间数据文件太频繁地使用大小太小的默认区进行自动扩展。
我认为只要我调整meRegionsNow表空间的大小,这个问题就会得到解决
数据文件。
发布于 2011-10-26 16:11:41
第一种方法可能更快,因为它在PL/SQL引擎和SQL引擎之间的上下文切换较少。您可以通过尝试这两种方法轻松地找到答案。
发布于 2011-10-26 16:26:43
您是否尝试过使用parallel提示并行化加载?(您可能会发现,您需要在加载过程中删除/无效约束和索引,然后在加载后将其重新打开)
INSERT /*+ APPEND PARALLEL*/ INTO meRegionsNow( .....
SELECT /*+ PARALLEL*/ .....有很多并行和直接负载工作的前提条件...
请参阅:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_9014.htm#SQLRF01604请参阅:http://download.oracle.com/docs/cd/E11882_01/server.112/e16541/parallel003.htm#VLDBG1455
发布于 2011-10-26 18:26:26
在块之间使用commits对数据进行分片应该会减少临时表空间的使用量,因此如果临时表空间有限,它可能会更可靠。
OTOH分片方法必须多次访问源表-但由于非分片方法似乎在表上使用独占索引查找,因此对性能的影响很小(如果单遍方法有完整的表扫描,分片可能会慢得多)。
https://stackoverflow.com/questions/7896777
复制相似问题