美文网首页
sql语句执行原理与执行顺序

sql语句执行原理与执行顺序

作者: 夏天的吃瓜群众 | 来源:发表于2018-01-12 13:44 被阅读0次

    一、sql语句执行原理

    第一步:客户端把语句发给服务器端执行

           在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程,二者之间的进程是一一对应的。

         当我们在客户端执行 select 语句时,客户端会把这条 SQL 语句发送给服务器端,让服务器端的进程来处理这语句。意思是,只有服务器上的数据库进程才会对SQL 语句进行相关的处理。

    第二步:语句解析

    当客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。

    1. 查询高速缓存(library cache)。

        服务器进程在接到客户端传送过来的 SQL 语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,则服务器进程就会直接执行这个 SQL 语句,省去后续的工作。

    2. 语句合法性检查(data dict cache)。

         当在高速缓存中找不到对应的 SQL 语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条 SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对 SQL 语句中所包含的表名、列名等等进行 SQL,它只是语法。

    3. 语言含义检查(data dict cache)。

        若 SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写 select 语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。

    4. 获得对象解析锁(control structer)。

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

    5. 数据访问权限的核对(data dict cache)。

        当语法、语义通过检查之后,客户端还不一定能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。

    6. 确定最佳执行计划 。

        当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的 sql 语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条 SQL 语句与执行计划保存到数据高速缓存(library cache)。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行 SQL 语句,提高 SQL 语句处理效率。

    第三步:语句执行

         语句解析只是对 SQL 语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条 SQL 语句。这个语句执行也分两种情况:

    (1)若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据;

    (2)若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache)。

    第四步:提取数据

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

    二、SQL语句中的函数、关键字、排序等执行顺序:

    1. FROM 子句返回初始结果集。

    2. WHERE 子句排除不满足搜索条件的行。

    3. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。

    4. 选择列表中指定的聚合函数可以计算各组的汇总值。

    5. 此外,HAVING 子句排除不满足搜索条件的行。

    6. 计算所有的表达式;

    7. 使用 order by 对结果集进行排序。

    8. 查找你要搜索的字段。

    文章摘自:http://mp.weixin.qq.com/s?src=3×tamp=1515722713&ver=1&signature=uzprhqOCP8FICSzR1P3IMah4WgSjZSi0*EAZBWbHAYS5EFwkxgEDNQp1p4s5qD6ssS2mvaRwzp*3hUb6A0STmQ*R5ygvvq*ae9TQ9UCfiXhmFdFlJSEOHtpnA0VpYcIiIzlH3ecnCcLM8RyalVEASnX5LJZc*dqXox9vD-xx9a4=

    相关文章

      网友评论

          本文标题:sql语句执行原理与执行顺序

          本文链接:https://www.haomeiwen.com/subject/cmwxoxtx.html