4.1.1  读取Oracle文件

一般来说,Oracle读取文件内数据的方式可分为物理读取与逻辑读取。

1. 物理读取

物理读取是将所需的数据从存储介质上读取到数据库高速缓冲区内,也就是当数据***次被读取到时,Oracle会先将其数据从数据文件所在的磁盘上读进数据库高速缓冲区中,并将这些数据放在LRU(Last Recently Used)里的MRU(Most Recently Used)端,当下次有需要时,此数据就可以直接从数据库高速缓冲区中读取或修改,而不必再耗费资源从磁盘上读取,如图4-3所示。

orc文件的getSchema变成_col0的java_读取oracle文件

图4-3  物理读取(一)由图4-3的示例显示,***次查询时必须执行物理读取,当再次查询时相关数据时就可以从数据库高速缓冲区中读取了,如图4-4所示。

orc文件的getSchema变成_col0的java_数据库_02

图4-4  物理读取(二)

提示

当新的数据需要读入数据库高速缓冲区内,而数据库高速缓冲区又没有足够的空间时,Oracle会根据LRU算法,将LRU 列表中LRU端的数据置换出去。当这些被置换出去的数据再次需要被读取时,就需要在重新从磁盘读出后,再次放入数据库高速缓冲区内,这就是LRU机制。

当发生全表扫描(Full Table Scan)时,Oracle并不会利用LRU机制将全表扫描数据放到LRU 列表的MRU端,而是直接放在LRU端,此目的是为了让全表扫描的数据尽快被移出。因为Oracle认为,全表扫描一般发生的频率较低,且全表扫描的数据大部分在以后都不会被经常使用到。但如果想将整个表放到数据库高速缓冲区中,可利以用Keep的方式将数据放到保留池中。

2. 逻辑读取

逻辑读取是从数据库高速缓冲区中读取数据块,按照读取数据块的模式不同,一般来说,逻辑读取可以分为即时读取(Current Read)和一致性读取(Consistent Read)。这两者***的区别在于数据的新旧之分,分别说明如下。

即时读取:在Oracle的数据库高速缓冲区内,任何时候都只会保留一份目前的数据;所谓的即时读取,就是读取目前***的数据,且通常发生在对数据进行修改与删除作业时。

一致性读取:相信大家都了解,Oracle是一个多用户的数据库系统,所以会发生当A用户开始会话,读取的数据还未读取完成之前,可能会有B用户会话修改A用户正在读取但尚未读取完的数据,这时,如果A用户会话读取到B用户会话修改后的数据,就会造成数据不一致的情况,这是相当严重的问题,而一致性读取就是为了保证数据的一致性,如图4-5与图4-6所示。为此,在数据库高速缓冲区中的数据块上,都会有***一次修改数据块时的SCN(System Change Number,系统修改号码)。如果一个事务(Transaction)需要修改数据块中的数据,会先在撤消段(Undo Segment,或称为Rollback Segment)中保存一份修改前数据和SCN的数据块,然后再更新数据库高速缓冲区中、数据块内的相关数据与其SCN,并标识其为脏(Dirty)数据。当其他用户会话读取数据块时,会先比较数据块上的SCN和自己的SCN,当数据块上的SCN小于等于本身的SCN时,则直接读取数据块上的数据;如果是大于本身的SCN,则会从撤消段中找出修改前的数据块并读取其数据。关于SCN的详细内容,请参阅第6.1节。

A用户会话所执行的相关信息如下:

orc文件的getSchema变成_col0的java_数据_03

图4-5  逻辑读取(一)B用户会话所执行的相关信息如下:

orc文件的getSchema变成_col0的java_数据库_04