第一步:客户端把语句发给服务器端执行:数据库
在客户端链接上服务器后,在客户端与服务器端都会造成一个进程,客户端上的咱们叫作客户端进程;而服务器上的咱们叫作服务器进程。全部的SQL语句都是在客户端进程产生的,在服务器进程执行的。缓存
第二步:语句解析:服务器
当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析(在服务器上进行)。此时服务器进程会对于SQL语句进行如下操做:优化
一、 查询高速缓存(位于SGA上一块SQL共享区域)。对象
服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。若是在数据高速缓存中,恰好有其余人使用这个查询语句的话(此时执行严格匹配),则服务器进程就会直接执行这个SQL语句,省去后续的工做。因此,采用高速数据缓存的话,能够提升SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另外一方面,也是由于这个语句解析的缘由。进程
SGA是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,若是实际内存不够再往虚拟内存中写。【百度百科】内存
二、语句合法性检查(语法分析器)。效率
当在高速缓存中找不到对应的SQL语句时,则数据库服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。若是服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程当中,不会对SQL语句中所包含的表名、列名等等进行SQL他只是语法上的检查。服务器端
三、语言含义检查(词法分析器)。百度
若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。若是表名与列名不许确的话,则数据库会就会反馈错误信息给客户端。
四、得到对象解析锁。
当语法、语义都正确后,系统就会对咱们须要查询的对象加锁。这主要是为了保障数据的一致性,防止咱们在查询的过程当中,其余用户对这个对象的结构发生改变(保证数据的一致性)。
五、数据访问权限的核对。
当语法、语义经过检查以后,客户端还不必定可以取得数据。服务器进程还会检查,你所链接的用户是否有这个数据访问的权限。若你链接上服务器的用户不具备数据访问权限的话,则客户端就不可以取得这些数据。
六、肯定最佳执行计划。
当语句与语法都没有问题,权限也匹配的话,服务器进程仍是不会直接对数据库文件进行查询。服务器进程会根据必定的规则,对这条语句进行优化(根据数据库版本规范进行小范围内优化)。
当服务器进程的优化器肯定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到数据高速缓存。如此的话,等之后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提升SQL语句处理效率。
第三步:语句执行。
语句解析只是对SQL语句的语法进行解析,以确保服务器可以知道这条语句到底表达的是什么意思。等到语句解析完成以后,数据库服务器进程才会真正的执行这条SQL语句。这个语句执行也分两种状况。一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。
第四步:提取数据。
当语句执行完成以后,查询到的数据仍是在服务器进程中,尚未被传送到客户端的用户进程。因此,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的做用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动做。