段头是第一个L3块,段头除了包含L3信息,还有Extent Map,也就是区地图,区地图就是记录一个段中所有区在哪的地图,全区扫描就是按区地图逐个读取所有区。
一些扫描:
oracle不会读dba_segments这个数据字段视图,它会读dba_segment低层seg$这样的数据字典表。会先找到共享池中的字段缓存中查找seg$相关的行,如果没有找到,再到Buffer Cache中读seg$相关的块,如果还没有,就到磁盘上SYSTEM表空间中读seg$表,当找到表的段头位置时,oracle会读取它里面的区地图。
dump命令:alter system dump datafile 4 block 141; 同一服务器进程会把dump信息写到一个dump文件中,如果你dump多次,dump信息就会被写入进一个文件里。
oracle不会读dba_segments这个数据字段视图,它会读dba_segment低层seg$这样的数据字典表。会先找到共享池中的字段缓存中查找seg$相关的行,如果没有找到,再到Buffer Cache中读seg$相关的块,如果还没有,就到磁盘上SYSTEM表空间中读seg$表,当找到表的段头位置时,oracle会读取它里面的区地图。
dump命令:alter system dump datafile 4 block 141; 同一服务器进程会把dump信息写到一个dump文件中,如果你dump多次,dump信息就会被写入进一个文件里。
oralce在读取表的段头时,consistent gets中有会两次会读到段头,因为段头中的Extent Map、Auxillary Map是分开存放的。
索引范围扫描是按照根、枝、叶的顺序读取。叶块的地址在枝块,枝块的地址在根块。在oracle中,根块永远在索引段头的下一个块处,因此,索引扫描是不必读取索引段头的,先在数据字典表里找到段头位置,块号加1就是根块位置了。
如果索引不是唯一的,叶块会扫描两次,第一次是为了取出目标行rowid,第二次是为了判断此叶块中还有没有满足条件的行。如果是唯一索引,只需要读取叶块一次,不需要判断是否还有满足条件的行。
语句执行:
语句执行过程分为三步:解析、执行和抓取,解析又分为硬解析、软解析。硬解析要生成执行计划,并将执行计划传到共享池中。软解析直接在共享池中取出执行计划就可以了。
Shared Pool Latch竞争:
Shared Pool Latch的申请主要出现在进程从共享池中分配内存时,在解析、执行、抓取,还有软解析、硬解析的过程中,什么时候进程需要从共享池分配内存呢?执行的时候不会,抓取的时候也不会。抓取主要是从磁盘或Buffer Cache中读数据,与共享池关系不大。那么解析呢?软解析不会,软解析只是查找、读取共享池中的执行计划。而硬解析需要将生成的执行计划存入共享池。在存入共享池浅,肯定先要在共享池中分配一块内存,然后才能将信息存进去。因此,只有在硬解析时,才会从共享池分配内存,因此,此Latch竞争很有可能是过多的硬解析造成的。但是除了硬解析,还有其他情况也会持有Shared Pool Latch,比如自动调节内存时,如果启用了内存自动调节,当oracle觉得共享池内存不足或太多时,也会持有Shared Pool Latch、调节共享池内存大小,有时这也会导致Shared Pool Latch的竞争。
语句执行过程分为三步:解析、执行和抓取,解析又分为硬解析、软解析。硬解析要生成执行计划,并将执行计划传到共享池中。软解析直接在共享池中取出执行计划就可以了。
Shared Pool Latch竞争:
Shared Pool Latch的申请主要出现在进程从共享池中分配内存时,在解析、执行、抓取,还有软解析、硬解析的过程中,什么时候进程需要从共享池分配内存呢?执行的时候不会,抓取的时候也不会。抓取主要是从磁盘或Buffer Cache中读数据,与共享池关系不大。那么解析呢?软解析不会,软解析只是查找、读取共享池中的执行计划。而硬解析需要将生成的执行计划存入共享池。在存入共享池浅,肯定先要在共享池中分配一块内存,然后才能将信息存进去。因此,只有在硬解析时,才会从共享池分配内存,因此,此Latch竞争很有可能是过多的硬解析造成的。但是除了硬解析,还有其他情况也会持有Shared Pool Latch,比如自动调节内存时,如果启用了内存自动调节,当oracle觉得共享池内存不足或太多时,也会持有Shared Pool Latch、调节共享池内存大小,有时这也会导致Shared Pool Latch的竞争。