SQL语句的执行过程

1.语法校验算法

      若是在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,若是有语法错误,服务器会结束查询操做,并用返回相应的错误信息给调用它的应用程序。数据库

注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select 写成selec等,错误信息中若是包含一列表中本没有的列,此时服务器是不会检查出来的,由于只是语法验证,语义是否正确放在下一步进行。缓存


2.检查语义服务器

      语法符合后,就开始验证它的语义是否正确。例如,表名、列名、存储过程等等数据库对象是否真正存在,若是发现有不存在的,就会报错给应用程序,同时结束查询。ide


3.得到对象的解析锁oop

     接下来就是得到对象的解析锁,咱们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,若是不加锁,此时有数据插入,但由于没有加锁的缘由,查询已经将这条记录读入,而有的插入会由于事务的失败会回滚,就会造成脏读的现象。优化


4.用户访问权限认证spa

     接下来就是对数据库用户权限的验证。SQL语句语法,语义都正确,此时并不必定可以获得查询结果,若是数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,每每一个项目里面会包含好几个数据库链接串,这些数据库用户具备不一样的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不一样的操做选取不一样的用户来执行。稍微不注意,不管你的SQL语句写的多么完善,天衣无缝都没用。orm


5.SQL优化,选择最高效的查询算法对象

       解析的最后一步,就是肯定最终的执行计划。当语法、语义、权限都验证后,服务器并不会立刻给你返回结果,而是会针对你的SQL进行优化,选择不一样的查询算法以最高效的形式返回给应用程序

例如在作表联合查询时,服务器会根据开销成原本最终决定采用hash join,merge join ,仍是loop join,采用哪个索引会更高效等等。不过它的自动化优化是有限的,要想写出高效的查询SQL仍是要优化本身的SQL查询语句。

当肯定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免从新编译执行计划。

相关文章
相关标签/搜索