ORACLE SQL-UPDATE、DELETE、INSERT优化和使用技巧

 

UPDATE

1、先备份数据(安全、提高性能)。

2、分批更新,小批量提交,防止锁表。

3、如果被更新的自动有索引,更新的数据量很大,先取消索引,再重新创建。

4、全表数据更新,如果表非常大,建议以创建新表的形式替代更新。

DELETE

1、分批提交、减少锁表时间、减少回滚段压力。

2、大批量数据删除加上rownum<1000。

3、大批量删除,禁止中途ctrl+c,或kill调session。

4、大量数据删除后最好重建索引,分析表。

INSERT

1、关闭redo log(ALTER TABLE <TABLENAME> nologging;)

2、使用/*+ append */ 暗示。

3、绑定变量。

4、批量提交。

5、如果表是静态,独占使用,可以去掉索引和其他相关约束。

6、大量灌入数据后要分析表。

7、使用SQL load快速装载数据。

要想提高insert的速度,首先要知道什么影响insert慢,在执行insert的过程中产生redo和undo,要想提高insert的速度,在充分利用系统资源的条件下就要尽量减少insert产生的redo和undo,undo的大小没办法改变,但是我们可以改变redo的量。下面是提高insert方法。

  1. 增加hint /*+ append */ --不用在高水位下查找可insert的空间,直接在高水位之上insert
  2.  增加hint /*+ parallel(tab,4) */
    或者alter session enable/disable parallel dml; ---充分利用系统硬件资源
  3. alter table tablename nologging/logging ----关闭表的log服务,减少redo产生
  4. 如果业务允许的话,可以先删除索引,insert之后再重建. ---减少在insert时维护索引的开销
  5. 可以增加临时中间表 ----减少此事务对undo的使用
  6. 增大sort_area_size或PGA ----增加排序空间,避免磁盘操作
  7. 优化sql语句本身
  8. pl/sql批处理 ---化整为零,把大事务变成零散的小事务

例子:

说明:tb_order_detail_his :7000W记录
tb_order_detail :2000W记录

优化前:
INSERT INTO /*+ append */ tablename_his
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) WHERE ID NOT IN (
SELECT tcc.id FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc , tablename_his tcch WHERE tcc.id=tcch.id
)

在做数据归档时,需要做大数据量的insert,对于insert内容少还是可以胜任的,可当要把200多万的数据归档,2个小时都没有成功,
于是对其优化改造,利用append,parallel,分批处理,nologging方法,使这个200W的数据归档在15分钟就完成


优化后:


通过 mod(tcc.id,10)把内容分10部分提交归档

INSERT INTO /*+ append */ tablename_his
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc WHERE NOT EXISTS (
SELECT /*+ parallel(tcch,7) parallel(tcc,7) */ tcch.id FROM tablename_his tcch WHERE tcc.id=tcch.id
) AND mod(tcc.id,10)=9

-----end-----

 

 

posted @ 2013-09-04 19:26  bj_google  阅读(1090)  评论(0编辑  收藏  举报