数据割接效率提升常用套路
Posted smokefire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据割接效率提升常用套路相关的知识,希望对你有一定的参考价值。
1:归档与非归档
在割接前将数据改为非归档模式,在割接后再改回来。同时做全备。
改为非归档模式会大大减少写日志的开销。
2:主外键、索引
在割接前,需要先失效主外键/索引或者直接drop掉。
割接后再恢复,回复索引,大一点的表并行建立,再取消并行。
3:空间换时间
A:数据量太大时,应该分模处理。
B:频繁关联的表,应该建成中间表。
C:中间表太大时,应该进行拆分。
D:中间表建好后,进行表分析。
4:nologging与append
Insert /*+ append */ into table nologging select * from tableb where mod(serv_id,10)=1;
A:不管哪种模式下append要与nologging方式联用才能达到很好的效果。
B: 非归档与归档方式,只用NOLOGGING是不起效果的。
C: 非归档下append已达到不错的效果,但不及与nologging的联用方式。
D: 归档下单append起不到效果。
E:对于11.2以下版本 append 只对insert into table select * from table 有用。
F:使用append在未提交时会锁表(类似for update)。所以维护时append基本都是禁用的。除非能保证数据没人在用!
G:不要一条一条commit !会把数据库撑很大很大!
5 并行
并行并不是越大越好,在并行开大时,容易造成并行锁,并影响割接效率。实际并行数量不应该超过数据库服务的CPU核数。
批量割接同时割接多个模和多个表时,完全可以不用并行。
6:seqs 不能不加cache,而且cache要大一点,割接完之后注意改回来。
7:游标与直接insert
大数据量操作,应该尽量避免:Insert into A select * from B 这种方式,因为容易引发undo空间不足,并且无法评估效率,也无法控制进度。 不如直接用游标。
8:游标效率
显示游标:
cursor cur_2 is select a.cust_name from ea_cust.cust_info a;
隐式游标
cur_2 in (select c.cust_name from ea_cust.cust_info c)
bulk方式
fetch cur_test bulk collect into wxk_test_data limit 100;
Bulk方式与隐式游标效率相当(略大于隐式游标)。
而隐式游标效率明显大于显式游标。
9:绑定变量
当SQL为动态SQL时,存储过程也会存在绑定变量问题。
当使用动态SQL时,类似如下语句是不合适的:
Sql = ‘insert into xx values (‘||v_id1||’)’
但是insert into xx values (v_id1)这种SQL是合适的,数据库自动会绑定变量。
10:当数据库为rac时,如果分模去insert表,不应该使用tns连接或者使用scanip连接,应该使用固定的IP地址连接,避免造成rac的资源竞争。
11:在后台用shell拉起长时间运行的存储过程,或者用job。而不是直接使用plsql运行。
以上是关于数据割接效率提升常用套路的主要内容,如果未能解决你的问题,请参考以下文章