SQL执行
概念
1、“数据库” 归属于数据文件
2、“实例”归属于内存结构,实例由系统的全局内存区域(SGA)以及一系列的后台集成组成
SGA共享池
1、是Oracle用来缓存程序数据的地方,执行过的每一条sql语句在共享池中都会留下解析后的内容。存储这些语句的地方称为高速缓存。Oracle在解析每条sql之前,都会现在共享池中查询是否存在相同的语句,若存在则不再重新解析,直接使用,而且该sql是在所有需要使用的用户之间共享。
2、使用 最近最少使用算法(LRU) 进行管理
库高速缓存
一、库高速缓存是共享池中用来保存之前已经解析过的语句的区域
1、软解析
Oracle判断该sql在以前已经执行过,将其从库高速缓存中取回来重用,称为软解析
2、硬解析
不存在库告诉缓存中,需要执行所有解析过程,并将其存入缓存中,称为硬解析
硬解析和软解析时间可能相差千倍,所以使用绑定变量而不是常量很重要,因为变量名不变还是可以共享,但是常量的话会导致硬解析。
判断SQL相同
- 确定一条SQL是否执行过,Oracle会检查库高速缓存,可以查询v$sql视图查看当前缓存中的sql
- 判断是否是相同的sql,Oracle使用hash值,所以,区分大小写,注释,空格
1、锁存器
- 锁存器是Oracle为了读取高速缓存或其他没存结构中的信息时必须获取的一种锁。在读取高速缓存中的任何信息前,Oracle都会获得一个锁存器,其他的会话必须等待,直到释放。
- 锁存器是使用轮询的方式获取,CPU会积极检查是否空闲,当前查询相当于被挂起,如果轮询次数达到最大值,则请求停止,CPU执行其他任务,会话排到后面去
- 锁存器是串行的
2、互斥锁
一个序列化组件,阻止多个线程同时访问一个共享结构,与锁存器相比,互斥锁的优点:
- 占内存少,且可快速获取和释放;
- 可直接修改游标的互斥锁引用计数,避免为已经打开的游标获取库高速缓存锁。
SGA缓冲区缓存
- 缓冲区缓存是系统全局内存区域最大的一部分。当数据库块从硬盘中读取出来或写入硬盘的时候用来存储数据库块。
数据块
1、块是Oracle进行操作的最小单位
2、块中包含表数据行或索引条目,有的还有用来排序的临时数据。
3、Oracle必须读取块来获得sql语句需要的数据行
4、块大小的唯一限制因素取决于所用的操作系统缓冲区亦使用LRC算法管理空间,亦使用锁存器
- 清空缓冲区 alter system flush buffer_cache;
- 清空共享池 alter system flush shared_pool;
- set autotrace traceonly statistics;
GUOCHEN@orcl> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.10
GUOCHEN@orcl> alter system flush shared_pool;
系统已更改。
已用时间: 00: 00: 00.45
GUOCHEN@orcl> set autotrace traceonly statistics;
GUOCHEN@orcl> select * from products;
已选择7行。
已用时间: 00: 00: 00.15
统计信息
----------------------------------------------------------
310 recursive calls
0 db block gets
50 consistent gets
16 physical reads
0 redo size
915 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
7 rows processed
GUOCHEN@orcl> set autotrace off
GUOCHEN@orcl> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.07
GUOCHEN@orcl> set autotrace traceonly statistics;
GUOCHEN@orcl> select * from products;
已选择7行。
已用时间: 00: 00: 00.03
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
6 physical reads
0 redo size
915 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
7 rows processed
GUOCHEN@orcl> select * from products;
已选择7行。
已用时间: 00: 00: 00.01
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
915 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
7 rows processed
查询转换
- 该步骤发生在查询执行完语法和权限检查之后,优化器为了决定最终的执行计划二为不同的计划计算成本预估之前。
- 转换为一些系列查询块
- 查询转化的主要目的就是确定如果盖面查询的写法会不会提供更好的查询方式
1、查询块
查询转换所能采用的方法取决于每个查询块的组成形式
2、转换方式
- 视图合并
- 子查询解嵌套
- 连结消除
- 排序消除
- 谓词推进
- 使用物化视图重写查询