sql运行机制

SQL整体执行过程

      第一步:程序把语句发给数据库服务器执行。当我们在数据层执行select语句时,程序会把SQL语句发送给服务器端,让服务器端进程来处理这语句。

  第二步:语句解析。

  当程序把SQL语句传送到服务器后,服务器进程会对该语句进行解析。语句解析是一个复杂的过程,主要流程如下:

  (1)查询高速缓存。服务器进程在接到程序传送过来的SQL语句时,不会直接去数据库查询,而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果存在,则服务器进程就会直接执行这个SQL语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也省去了语句解析等工作。

  (2)语法检查。当在高速缓存中找不到对应的SQL语句时,则数据库服务器进程就会开始检查这条语句的语法合法性。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给程序。

  (3)语义检查。若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给程序。

  (4)获得对象解析锁。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。

  (5)数据访问权限的核对。当语法、语义通过检查之后,服务器进程还会检查连接的用户是否有数据访问的权限。若用户不具有数据访问权限,则程序就不能够取得这些数据。

  (6)确定最佳执行计划。当语句与语法都没有问题,权限也匹配的话,服务器进程开始根据一定的规则,对这条语句进行优化。当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到数据高速缓存。

  第三步:语句执行。

  SQL语句执行也分两种情况。若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给程序。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(ORACLE会将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享,当你执行一个SQL语句时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径。)。

  第四步:提取数据。

  当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到程序的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询操作。

你可能感兴趣的:(sql运行机制)