Insert、update、Create和Select的执行优化

当面临优化的问题,首先了解一下logging;

传统的插入方式 insert into 表(字段) values (字段值); insert into select * from tab;都是串行,会将插入的数据放在buffer_cache,会在插入之前检查表中是否有空余块可以追加插入.并写入redo和undo。
当面临大量数据插入的时候,我们选择如何优化呢?
1、选择direct-path insert插入,主要优点,就是插入的时候不会写入buffer_cache,省掉了buffer block 的格式化和dbwr的操作,直接从pga写入磁盘;不检查表中现有的block是否有空闲空间,直接在表的高水位线(hwm)以上插入;如果数据库处于归档模式或者非归档模式,表级处于nologging状态下,只有少量的空间信息redo写入,不写入数据undo (因为需要回滚时直接回退到高水位线,而不需要对insert生成delete回滚记录),所以在特定的情况下,效率会比传统的串行插入效率高很多。
---------------------------------------------------------------------------------------------------

SGA(System Global Area),即系统全局区,Oracle中最重要的内存区。

PGA(Process Global Area),即程序全局区,一个进程的专用的内存区。

UGA(User Global Area),即用户全局区,与特定的会话相关联。

CGA  (CALL Global Area),即调用全剧区,如排序区,HASH JOIN区,位图合并区等

———————————————————————————————————————————————————
现在熟悉direct-path insert对log的影响。
1、数据库级别处于非 force logging.在日志处于归档模式下,表无论处于logging还是nologging状态下,虽然也能执行direct-path insert,但都会写入完整的redo和undo,效率会折扣.(如果数据库或者表空间处于 force logging模式,无论单表的logging如何设置,都会写入完整的undo和redo)
2、数据库处于非 force logging,日志处于非归档模式,表设置为nologging,效率最高.
-------------------------------------------------------------------------------------------------------------------------------
与append的连用
归档模式下:如果表设置为logging状态下,虽然能执行direct-path insert append, 但还是会记录redo记录,就算你在insert后面机上nologging,undo和redo照写不误.
非归档模式下:无论表级别处于logging还是nologging,使用/*+append*/ hint,都会执行direct-path insert ,将不记录undo和redo.
dml模式的插入:
dml下并行的插入,direct-path insert是默认的,如果想不使用,可以加上noappendhint.以下是dml并行模式下的方式:
并行dml的前提条件:
1、oracle的版本是 oracle enterprise edition
2、会话开启了dml模式
3、如下条件必须满足其一:
a、目标表开启了并行属性(degree)
b、使用了/*+parallel*/
c、参数parallel_degree_policy设置为auto;








猜你喜欢

转载自blog.csdn.net/qq_24726509/article/details/81011633