老师布置了一个大作业问题是,当DBMS接受到一条sql查询语句时,其内部进行了哪些处理,直到最终返回结果?没有一点思路。我没有搞清楚DBMS是如何执行sql的

解决方案 »

  1.   

        分析:其中包括语法分析、语义分析、视图转换、表达式转换、选择优化器、选择连接方式、选择连接顺序、选择数据搜索路径等等,然后在SGA中的共享SQL区中找是否执行过该语句,如找到则直接执行已编译的SQL语句,如没有找到,则先编译后放入SGA,并执行编译后的SQL语句。   执行:在执行编译过的SQL语句时,先在SGA中的数据库缓冲区内查找是否存在所需要的数据,如有直接读取,如果没有,则从物理文件中读取至数据库缓冲区并读取。  返回结果:对SELECT 语句需要返回结果的语句,先看是否需要排序,需要,则排序后返回给用户,然后根据内存的大小不同,可以一次取出一行数据,也可以一次取一组数据。你使用动态游标就可以跟踪整个select过程
      

  2.   

    上面的图片有点问题
    Oracle会为每个用户进程分配一个服务器进程:service process(实际情况应该区分专用服务器和共享服务器),当service process接收到用户进程提交的sql语句时,服务器进程会对sql语句进行语法和词法分析。
     名词解释:
     语法分析:语句本身正确性。
     词法分析:对照数据字典中检查表,索引,视图和用户权限。
     检查通过后,服务器进程会将sql语句转变为ascii码,并通过一个hash函数将ascii码生成出一个hash值,服务器进程会到share pool中查询此hash是否存在,如果存在,服务器进程会从sharepool中读取已经解析好的语句来执行;如果不存在,则需要做以下步骤:生成执行计划和生成执行编码(请理解何为执行计划)。解析完成后,Oracle会将sql语句本身代码、hash值、编译代码、执行计划和所有与该语句相关的统计数据存放到sharepool中。