数据割接效率提升常用套路

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运行。

posted @ 2018-07-30 19:37  笑扯风云蛋  阅读(915)  评论(0编辑  收藏  举报