有两种读:逻辑读和物理读
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出泊头免费做网站回馈大家。
数据库读写的单位是数据块。当用户最终得到的结果可能只是某个数据块中的几行或几列。当一个查询语句被执行时,服务器进程会将相关的数据块从数据文件中写入内存(buffer cache)。这就叫做物理读。每读取一个数据块,即是一次物理读。
而用户需要的并不是整个数据块,而是其中的几行或几列。从buffer cache中提取行的过程,便是逻辑读。
而其中逻辑读又分成两种:即时读(current read)和一致性读(consistent read)。
(1)即时读::即时读就是读取数据块当前的最新数据。任何时候在buffer cache中都只有一份当前数据块。即时读通常发生在对数据进行修改,删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏数据”。
(2)一致性读:
一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。
如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。
当其他进程读取数据块时,会先比较数据块上的SCN和自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;
如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。
综上所述,逻辑读的原理和过程比较复杂。逻辑读的单位并不能简单的认为是个块。
Oracle读取数据的最大限制取决于操作系统和Oracle对多块读IO的限制。在物理上来说,一个SQL语句要读取某个记录,必须将该记录读取到DB CACHE中,然后才能从DB CACHE中获取,这种访问我们一般称为物理读(READ),如果这个数据已经存在于DB CACHE中,那么前台进程可以直接从DB CACHE中读取数据,这样的读取成为逻辑读(GET),如果要读取的数据已经被修改,需要从UNDO中读取前映像来获取一致性的数据,那么会从UNDO中取出前映像,和当前的数据块一起形成一个一致性读块(CR BLOCK),然后再从CR BLOCK中读取数据,这种访问方式称为一致性读(CR GET)。 从逻辑上讲, Oracle读取数据通过三种途径:全表扫描( Full Table Sacn,FTS )、引扫描、通过ROWID直接访问。在阅读SQL执行计划的时候,可以通过 TABLE ACCESS子句来查看Oracle访问某个表的方法,一般来说,对于大型的表来说,如果出现 TABLE ACCESS FULL 的提示,是需要加以重视的,一般情况下,对于大表的全表扫描应该是尽量避免的。下面是一个简单的执行计划:Query Plan----------------------------------------- SELECT STATEMENT [CHOOSE] Cost=1234 TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED]查看SQL的执行计划的时候,最右边的,最上面的操作是首先被执行的,上面的例子只有一个操作,就是对表“LARGE”进行全表扫描。当这个步骤执行完毕后,就会将结果集返回给上面一层的语句,上面的例子就是 SELECT STATEMENT 这个语句,一般来说 SELECT STATEMENT 是整个执行计划的顶层。 [CHOOSE]表明这个SQL语句的OPTIMIZER_GOAL ,在这个提示的右侧是COST数据,如果COST是有实际值的,那么说明使用了CBO优化器,如果COST没有实际值,那么说明使用了RBO优化器。比如: SELECT STATEMENT [CHOOSE] Cost=COST只是一个相对的值,只是优化器用来分析访问路径的优劣的,相同的SQL, COST越小的执行计划,起执行效果越好,开销越小。而不同的SQL ,其COST值是没有可比性的。 [:Q65001]指明这部分操作被采用并行查询的方式执行,
1. 物理读
这个很容易理解,cpu需要的数据在内存中找不到,那么此时必须去物理磁盘上获取,必然产生物理i/o。
反应在oracle中,就是会话需要某条数据时,在内存的buffer cache中中没有,此时就要去磁盘上的dbf文件中读取。就产生物理读。
2. 逻辑读
这个概念是最清晰,但同时又是最模糊的。
按照计算机原理来讲,逻辑读,表示cpu需要的数据在内存中被找到,数据被直接从内存中传入cpu执行。
3. 即时读(又叫当前读)
按照tom大师的描述:
当前读(Current read):得到块来实际更新所要修改的行时,所完成的获取就是当前读。
这么话怎么理解?
A:读块的时候要加锁。如果读块的目的是为了定位行、然后修改,这时加的锁和纯读的锁并不一样,虽然它们两个都是读操作。
因为加的锁不同,就有了当前读和一致读。
4. 一致读
按照tom大师的描述:
一致读(Consistent read):“发现”要修改的行时,所完成的获取就是一致读。
这么话怎么理解?
A:一致读和当前读放在一起时,一致读指的纯读。
5. 读一致性
这个概念,无庸置疑。
读一致性:Oracle在需要时会使用undo数据来构造CR块,从而提供非阻塞的查询。