认识Oracle的回滚操作后对查询的影响
2009-01-07 10:05
435 查看
1 打开分析参数
SQL> set autotrace traceonly statistics
2 创建测试用的表格
SQL> create table t as select * from all_objects where 1=0;
表已创建。
SQL> desc t;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
3 看看表格里的数据,首次读取
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
264 recursive calls
0 db block gets
30 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
4 再次查看,发现不再进行磁盘读取了
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
5 插入大量的数据,伴随着大量的磁盘操作
SQL> insert into t select * from all_objects;
已创建49883行。
统计信息
----------------------------------------------------------
57484 recursive calls
4139 db block gets
67164 consistent gets
290 physical reads
5623980 redo size
670 bytes sent via SQL*Net to client
575 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
348 sorts (memory)
0 sorts (disk)
49883 rows processed
6 马上回滚
SQL> rollback;
回退已完成。
7 再次查看磁盘操作情况,发现有较大的数据读取
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
689 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
8 再次查看,同样的结果
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
689 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL>
9 结论:
回滚并不是让磁盘恢复到以前的样子。前面的INSERT 操作将一些块增加到表的高水位线(high-water mark,HWM)之下,这些块没有因为回滚而消失,它们还在那里,而且已经格式化,只不过现在为空。全表扫描必须读取这些块,看看其中是否包含行。这说明,回滚只是一个“将数据库还原“的逻辑操作。数据库并非真的还原成原来的样子,只是逻辑上相同而已。
SQL> set autotrace traceonly statistics
2 创建测试用的表格
SQL> create table t as select * from all_objects where 1=0;
表已创建。
SQL> desc t;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
3 看看表格里的数据,首次读取
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
264 recursive calls
0 db block gets
30 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
4 再次查看,发现不再进行磁盘读取了
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
5 插入大量的数据,伴随着大量的磁盘操作
SQL> insert into t select * from all_objects;
已创建49883行。
统计信息
----------------------------------------------------------
57484 recursive calls
4139 db block gets
67164 consistent gets
290 physical reads
5623980 redo size
670 bytes sent via SQL*Net to client
575 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
348 sorts (memory)
0 sorts (disk)
49883 rows processed
6 马上回滚
SQL> rollback;
回退已完成。
7 再次查看磁盘操作情况,发现有较大的数据读取
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
689 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
8 再次查看,同样的结果
SQL> select * from t;
未选定行
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
689 consistent gets
0 physical reads
0 redo size
992 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL>
9 结论:
回滚并不是让磁盘恢复到以前的样子。前面的INSERT 操作将一些块增加到表的高水位线(high-water mark,HWM)之下,这些块没有因为回滚而消失,它们还在那里,而且已经格式化,只不过现在为空。全表扫描必须读取这些块,看看其中是否包含行。这说明,回滚只是一个“将数据库还原“的逻辑操作。数据库并非真的还原成原来的样子,只是逻辑上相同而已。
相关文章推荐
- oracle 如何查询过去某个时间点的记录(应用于某个时间点的误操作,回滚到之前的操作)
- 从头认识Spring-1.16 SpEl对集合的操作(2)-查询集合以及投影元素集合
- oracle基本信息的查询脚本(表空间、回滚段等)
- oracle中not exists对外层查询的影响详解
- Oracle 学习笔记 14 -- 集合操作和高级子查询
- 【oracle】truncate 操作对索引的影响
- Oracle 10g中闪回查询操作实例(一)
- oracle 性能优化操作十: 分解复杂查询,用常量代替变量
- Oracle技术之批操作性能影响诊断
- 终极解决sqlserver、MySQL、Oracle三种数据库模糊查询语句,ssm框架mybatis操作数据库
- oracle 性能优化操作三:增加查询的范围限制
- oracle 性能优化操作七:索引提高数据分布不均匀时查询效率
- ORACLE空间管理实验6:块管理之ASSM下插入操作--高水位的影响及大并发插入的性能问题
- 初探Oracle--Oracle查询操作
- 思考线上如何既保证不影响查询,又能做更新操作
- 在SQL Server中连接Oracle,完成查询、插入操作
- Oracle 基本操作二:内连接,左连接,右连接,自连接,集合查询(union)
- Oracle参数对查询的影响
- 如何查询oracle中sql操作的记录
- Oracle无法操作只能查询:record is locked by another user