每种类型的语句都需要如下阶段:
· 第1步: Create a Cursor 创建游标
· 第2步: Parse the Statement 分析语句
把SQL从用户进程载入到Oracle'shared pool
if( hash_value(Sql_Statement) in hash_table == true )
(
soft_parse;
) else (
hard_parse;
)
soft_parse:主要是为了验证用户是否有权限run this sql.
hard_parse:
1.语法分析
2.语义分析
3.通过数据字典验证对象和列等信息
4.同义词转换(如果存在)
5.用户权限验证
6.根据优化器,生成执行计划
7.载入library cache
(分析过程中要用到dictionary cache中的信息,如查阅用户权限等)
if (Sql_Statement == 'SELECT') call第3,4步
· 第5步: Bind Any Variables 绑定变量
if(Sql_Statement == 'Parallelize') call第6步
· 第7步: Run the Statement 运行语句
if (Sql_Statement == 'SELECT') call第8步
· 第9步: Close the Cursor 关闭游标
如果使用了并行功能,还会包含下面这个阶段:
· 第6步: Parallelize the Statement 并行执行语句
如果是查询语句,则需要以下几个额外的步骤,如图 3所示:
· 第3步: Describe Results of a Query 描述查询的结果集
· 第4步: Define Output of a Query 定义查询的输出数据
· 第8步: Fetch Rows of a Query 取查询出来的行,把fetch 的数据放入databuffer
(如果在databuffer中不存在)