<p>author:skate<br>
time:2010/10/19</p>
<hr>
<p><br>
insert优化</p>
<p>要想提高insert的速度,首先要知道什么影响insert慢,在执行insert的过程中产生redo和undo,要想提高insert的速
度,在充分利用系统资源的条件下就要尽量减少insert产生的redo和undo,undo的大小没办法改变,但是我们可以改变redo的量。下面是提
高insert方法。</p>
<p>1. 增加hint /*+ append */ <span style="color: #008000;">--不用在高水位下查找可insert的空间,直接在高水位之上insert</span>
<br>
2. 增加hint /*+ parallel(tab,4) */ <br>
或者alter session enable/disable parallel dml; <span style="color: #008000;">---充分利用系统硬件资源<br></span>
3. alter table tablename nologging/logging <span style="color: #008000;">----关闭表的log服务,减少redo产生</span>
<br>
4. 如果业务允许的话,可以先删除索引,insert之后再重建. <span style="color: #008000;">---减少在insert时维护索引的开销<br></span>
5. 可以增加临时中间表 <span style="color: #008000;">----减少此事务对undo的使用</span>
<br>
6. 增大sort_area_size或PGA <span style="color: #008000;">----增加排序空间,避免磁盘操作<br></span>
7. 优化sql语句本身<br>
8. pl/sql批处理<span style="color: #008000;">---化整为零,把大事务变成零散的小事务</span>
</p>
<p><span style="color: #008000;">说明:</span>
tb_order_detail_his :7000W记录<br>
tb_order_detail :2000W记录</p>
<p><span style="color: #008000;">优化前:</span>
<br>
INSERT INTO /*+ append */ tablename_his <br>
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) WHERE ID NOT IN (<br>
SELECT tcc.id FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc , tablename_his tcch WHERE tcc.id=tcch.id <br>
) </p>
<p>在做数据归档时,需要做大数据量的insert,对于insert内容少还是可以胜任的,可当要把200多万的数据归档,<span style="color: #ff0000;">2个小时</span>
都没有成功,<br>
于是对其优化改造,利用append,parallel,分批处理,nologging方法,使这个200W的数据归档在<span style="color: #ff0000;">15分钟</span>
就完成</p>
<p><br><span style="color: #008000;">优化后:</span>
</p>
<p><span style="color: #008000;"><br></span>
通过 <span style="color: #008000;">mod(tcc.id,10)</span>
把内容分10部分提交归档</p>
<p>INSERT INTO /*+ append */ tablename_his <br>
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc WHERE NOT EXISTS (<br>
SELECT /*+ parallel(tcch,7) parallel(tcc,7) */ tcch.id FROM tablename_his tcch WHERE tcc.id=tcch.id <br>
) AND mod(tcc.id,10)=9</p>
<p>-----end-----</p>
time:2010/10/19</p>
<hr>
<p><br>
insert优化</p>
<p>要想提高insert的速度,首先要知道什么影响insert慢,在执行insert的过程中产生redo和undo,要想提高insert的速
度,在充分利用系统资源的条件下就要尽量减少insert产生的redo和undo,undo的大小没办法改变,但是我们可以改变redo的量。下面是提
高insert方法。</p>
<p>1. 增加hint /*+ append */ <span style="color: #008000;">--不用在高水位下查找可insert的空间,直接在高水位之上insert</span>
<br>
2. 增加hint /*+ parallel(tab,4) */ <br>
或者alter session enable/disable parallel dml; <span style="color: #008000;">---充分利用系统硬件资源<br></span>
3. alter table tablename nologging/logging <span style="color: #008000;">----关闭表的log服务,减少redo产生</span>
<br>
4. 如果业务允许的话,可以先删除索引,insert之后再重建. <span style="color: #008000;">---减少在insert时维护索引的开销<br></span>
5. 可以增加临时中间表 <span style="color: #008000;">----减少此事务对undo的使用</span>
<br>
6. 增大sort_area_size或PGA <span style="color: #008000;">----增加排序空间,避免磁盘操作<br></span>
7. 优化sql语句本身<br>
8. pl/sql批处理<span style="color: #008000;">---化整为零,把大事务变成零散的小事务</span>
</p>
<p><span style="color: #008000;">说明:</span>
tb_order_detail_his :7000W记录<br>
tb_order_detail :2000W记录</p>
<p><span style="color: #008000;">优化前:</span>
<br>
INSERT INTO /*+ append */ tablename_his <br>
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) WHERE ID NOT IN (<br>
SELECT tcc.id FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc , tablename_his tcch WHERE tcc.id=tcch.id <br>
) </p>
<p>在做数据归档时,需要做大数据量的insert,对于insert内容少还是可以胜任的,可当要把200多万的数据归档,<span style="color: #ff0000;">2个小时</span>
都没有成功,<br>
于是对其优化改造,利用append,parallel,分批处理,nologging方法,使这个200W的数据归档在<span style="color: #ff0000;">15分钟</span>
就完成</p>
<p><br><span style="color: #008000;">优化后:</span>
</p>
<p><span style="color: #008000;"><br></span>
通过 <span style="color: #008000;">mod(tcc.id,10)</span>
把内容分10部分提交归档</p>
<p>INSERT INTO /*+ append */ tablename_his <br>
SELECT * FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc WHERE NOT EXISTS (<br>
SELECT /*+ parallel(tcch,7) parallel(tcc,7) */ tcch.id FROM tablename_his tcch WHERE tcc.id=tcch.id <br>
) AND mod(tcc.id,10)=9</p>
<p>-----end-----</p>

被折叠的 条评论
为什么被折叠?



