1 一个SQL语句进入到oracle以后都经过哪些步骤?
客户端输入sql语句
sql语句通过网络到达数据库实例
server process接收sql语句先进入共享池
1.解析:消耗很多资源:CPU、IO
2.sql--解析成执行计划,然后oracle才能执行
共享池:找是否有缓存sql语句以及其所对应的执行计划,如果没有会开始解析
数据库缓存区:用来缓存dbf文件的数据,当一个进程访问数据时,server process首先到buffer cache中找,如果没有就去dbf中找,然后取出来放到buffer cache中,在从buffer cache返回给用户。
2 server process执行sql语句时,要去访问某个表,首先读buffer cache找是否有这个表的数据,如果有直接从buffer cache读,这个叫逻辑读,也叫内存读。如果找不到就去dbf读,这个叫磁盘读,也叫物理读。
3 SQL语句的更新过程
首先server process将sql语句读到内存中,在内存中对这个表进行修改,会产生日志写到日志缓冲区里。修改完内存中的数据与dbf中的数据不一样了,所以通过DBWR进程要将内存中修改的数据写入dbf文件中,LGWR将修改的日志写入磁盘log文件中。
4 归档日志:默认有三块日志,都写满后又从第一块开始覆盖,发生日志切换时将被覆盖的日志文件复制到归档存储器
5 shared pool中有三块区域:(解析的过程用到这个)
free空间
library cache库缓存:缓存sql语句以及其执行计划
row cache数据字典:存储oracle数据库自身的信息
6 SQL语句的解析类型
server process首先会拿着SQL语句进入shared pool的library cache找这个SQL语句以前有没有被解析过,如果有就不需要解析(其实还是需要解析,不过叫做软解析);如果没有,oracle会进行硬解析。
硬解析步骤:首先会判断这个SQL语句语法有没有错误;
然后看这个语句中涉及的对象存不存在;
执行这条SQL语句的用户对这个表和相关的对象有没有权限;
在执行方案中找最优的方案作为执行计划(最消耗资源)
软解析步骤:SQL语句语法
检查用户权限
7 shared pool内存块组成
只能设置总体的shared poor大小,但是library cache和row cache大小是oracle自动生成。
free空间内存:是一个个小的内存块(chunk),用各个链(chan)连着挂起来,不同链挂着内存块大小不同,越往下越大。
硬解析需要从free里找chunk
chan:可以将特性类似的内存块串起来;可以遍历(latch锁用来保护链)
library cache内存:也有大量的链,每个链都是有编号的,当从free空间将执行计划挂到library cache上时,通过将SQL语句转换成ASCII码,再进行计算得到一个对应链的编号,接着查找对应编号的链,将其挂在上面,如果后面再次执行了这条SQL语句,就会锁住那个链在那个链上进行遍历找到chunk,找到以后就不会发生硬解析了,发生软解析。
8 为了减少解析,需要SQL共享,SQL共享需要:
1). SQL语句完全相同;
2). 使用绑定变量共享SQL:
declare v_sql varchar2(50);
begin for i in 1..10000 loop
v_sql := ' insert /*hello*/ into test values (:1); // :1 占位符
execute immediate v_sql using i;
end loop;
commit;
ent;
关于SQL语句解析过程的一些简单总结
最新推荐文章于 2023-08-26 19:05:18 发布