由于内存的读写效率比磁盘的读写效率高万倍,因而,为了降低IO wait,oracle会将数据cache在内存(Buffer Cache,对Buffer Cache的详尽介绍可以参见《Oracle内存全面分析》)中,对数据的读写尽量在内存中完成。
当Buffer Cache中的数据缓存块被修改过了,它就被标记为“脏”数据。根据LRU(Least Recently Used)算法,如果一个数据块最近很少被使用,它就称为“冷”数据块。进程DBWn(系统中可以存在多个DBW进程,n为序号)负责将“冷”的“脏”数据写入数据文件中去。DBWn进程会在以下两种情况下将“脏”数据写入磁盘中去:
当服务进程扫描一定数量(阀值)的Buffer Cache后还没有找到干净、可重用的缓存块后,它会通知DBWn进程将“脏”数据写入文件中去,以释放出空闲缓存;
当发生检查点(Checkpoint)时。
1.1.3 Redo Log
在非直截写(Direct Write)的情况下,事务中的写操作都会产生Redo Log,作为数据块异常关闭时的恢复记录。同样,和写用户数据类似,Redo Log也不会被直截写入Redo Log文件,而是先写入Log Buffer中。
Log Buffer是一个可以循环重用的缓存区。LGWR进程负责将Log Buffer中的记录写入Redo Log File中去。一旦Log Buffer中的条目被写入了Redo Log文件中,就可以被重用了。
为了保证事务尽快获得Log Buffer,LGWR进程一般会尽快将Log Buffer中的数据写入Redo Log文件中去。在以下几种情况下,LGWR回将一个持续的Log Buffer写入Redo Log文件中去:当一个事务提交(COMMIT)时;
每3秒钟写一次Log Buffer;
当Log Buffer到达1/3满时;
当DBWn进程将“脏”数据写入磁盘时;
1.1.4 Archive Log
当据库的Archive Log模式被激活后,所有Redo Log数据都会被写入Archive Log文件中以便日后进行复原。当发生日志组切换时,ARCn(Archive进程,可以存在多个)进程就会Redo Log文件拷贝到指定存储目录中去,成为Archive Log文件。
1.1.5 临时表空间
当Oracle在执行一些SQL时,会需要一些临时空间来存储执行语句时产生的中间数据。这些临时空间由Oracle从指定的临时表空间中分配给进程。主要有三种情况会占用临时空间:临时表/索引操作、排序和临时LOB操作。临时表/索引
在会话中,当第一次对临时表进行INSERT(包括CTAS)时,Oracle会从临时表空间中为临时表及其索引分配临时空间一存储数据。排序
任何会使用到排序的操作,包括JOIN、建立(重建)INDEX、ORDER BY、聚合计算(GROUP BY)以及统计数据收集,都可能使用到临时表空间。
排序操作首先会选择在内存中的Sort Area进行(Sort In Memory),一旦Sort Area不足,则会使用临时空间进行排序操作(Sort In Disk)。看以下例子:
SQL> alter session set sort_area_size = 10000000;
Session altered.
SQL> select owner, object_name from t_test1
2 order by object_id;
47582 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1312425564
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
“电脑街”你的好朋友
------------------------------------------------------------------------------
| 0 | select STATEMENT | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 1 | SORT ORDER BY | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 2 | TABLE ACCESS FULL| T_TEST1 | 47582 | 1486K| 150 (1)| 00:00:02 |
------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
658 consistent gets
0 physical reads
0 redo size
1566184 bytes sent via SQL*Net to client
35277 bytes received via SQL*Net from client
3174 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
47582 rows processed
SQL> alter session set sort_area_size = 10000;
Session altered.
