SQL语句的执行过程
2014-03-26 20:20
323 查看
服务器接收到SQL语句之后,要经过如下步骤完成操作:Parse(解析)―> Bind(绑定)―> Execute(执行)。
画个流程图比较明显的表示了这些过程:
下面说明执行的具体细节:
1 Select(查询)
2 INSERT/DELETE/UPDATE
这些都是对数据进行修改的语句,画个流程图,简洁明了:
这个叙述比较混乱,举个例子:
有这样一行,学生id是100,成绩是99,现在要将这个成绩改成80(这个ID对应的行,有且仅有一行)。
SQL应该是update student set score=80 where stu_id = 100;
假设这个数据块已经在buffer cache里了,那么就要首先取得两个锁:表的数据行独占锁和数据行独占锁。下面,就要把记录为99的数据Redo Entry复制到log buffer。然后,会产生undo block,大概是这样的(100,99)。这之后,会把修改的Redo Entry也复制到log buffer里去,这个是80的。所有这些做完以后,成绩会被从99更新到80。
这一切之后,输入commit。
这时数据库会做这些事情:
1 会把commit的Redo Entry复制到Log Buffer里,这样的话,按照时间顺序,Log Buffer里就有了如下三组:(100,99),(100,80),commit。
2 启动LGWR。按照上面的顺序把Log Buffer写到Online Logfile里。
3 告诉用户进程,结束了。
很长时间以来,我都以为commit以后,数据会被写到数据文件里,就是Datafile,但是事实不是这样。上面的步骤完成之后Datafile里存在的还是(100,99)。下次再查询的时候,就直接查缓冲区数据了。如果缓冲区紧张了,DBWR会开始工作,将缓冲刷进数据文件
画个流程图比较明显的表示了这些过程:
下面说明执行的具体细节:
1 Select(查询)
2 INSERT/DELETE/UPDATE
这些都是对数据进行修改的语句,画个流程图,简洁明了:
这个叙述比较混乱,举个例子:
有这样一行,学生id是100,成绩是99,现在要将这个成绩改成80(这个ID对应的行,有且仅有一行)。
SQL应该是update student set score=80 where stu_id = 100;
假设这个数据块已经在buffer cache里了,那么就要首先取得两个锁:表的数据行独占锁和数据行独占锁。下面,就要把记录为99的数据Redo Entry复制到log buffer。然后,会产生undo block,大概是这样的(100,99)。这之后,会把修改的Redo Entry也复制到log buffer里去,这个是80的。所有这些做完以后,成绩会被从99更新到80。
这一切之后,输入commit。
这时数据库会做这些事情:
1 会把commit的Redo Entry复制到Log Buffer里,这样的话,按照时间顺序,Log Buffer里就有了如下三组:(100,99),(100,80),commit。
2 启动LGWR。按照上面的顺序把Log Buffer写到Online Logfile里。
3 告诉用户进程,结束了。
很长时间以来,我都以为commit以后,数据会被写到数据文件里,就是Datafile,但是事实不是这样。上面的步骤完成之后Datafile里存在的还是(100,99)。下次再查询的时候,就直接查缓冲区数据了。如果缓冲区紧张了,DBWR会开始工作,将缓冲刷进数据文件
相关文章推荐
- 存储过程中执行动态Sql语句
- ORACLE数据库SQL语句的执行过程
- MySQL存储过程中实现执行动态SQL语句的方法
- sqlserver 存储过程中拼接sql语句 动态执行
- SQL语句的执行过程
- Mysql 将结果保存到文件 从文件中执行sql语句 记录操作过程(tee 命令的使用)
- 在SQL SERVER中定时执行SQL语句,或者存储过程.
- oracle存储过程中如何执行动态SQL语句
- oracle执行sql语句的过程
- mysql 存储过程 根据参数 动态执行sql语句
- SQL语句的执行过程
- sql语句执行过程的跟踪方法相关介绍
- Oracle SQL语句执行过程
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
- SQL语句执行过程详解
- 在ASP.NET中用存储过程执行SQL语句
- 存储过程和T-SQL语句的执行计划重用性比较
- MySql带参数的存储过程编写(动态执行SQL语句)
- 存储过程中执行动态Sql语句
- sqlplus执行存储过程和sql语句