sql语句的执行原理分析

sql语句的执行原理分析
原理:
第一步:应用程序查询SQL语句发送到服务器端。
当我们在数据层执行SQL语句时,应用程序将连接到相应的数据库服务器,并将SQL语句发送到服务器处理程序。
第二步:服务器解析请求的SQL语句。
1:SQL缓存,经常使用查询分析器的朋友会知道这样一个事实:查询通常需要执行一个特别长的时间第一次运行的时候,但如果你运行相同的声明立即或在一定时间内,会在很短的时间内返回查询结果。 U3000 U3000
原因
1)在接收到查询请求后,服务器不会立即进入数据库查询,而是在数据库缓存中找到相应的执行计划。如果存在,它将直接调用已编译的执行计划,并保存执行计划的编译时间。
2):如果查询行已经存在于数据缓冲区中,不查询物理文件,而是从缓存中提取数据,则从内存中读取的数据将从硬盘中读取的数据将大大加快,提高查询效率。后面会提到数据缓冲区。
2:如果在缓存中SQL计划中没有相应的执行计划,服务器将首先在用户请求的SQL语句语法上进行测试,如果存在语法错误,服务器将结束查询操作,并调用它,应用程序返回相应的错误消息
注意:返回错误信息,只包含语法错误的信息,如选择选择,错误消息包含一个列表如果不上市,那么服务器未签出,因为只有语法语义正确性验证,下一步。
在3:语法满足之后,它开始验证它的语义是否正确,例如表名、列名、存储过程等,数据库对象是否真的存在。如果发现没有存在,它将向应用程序报告错误的应用程序,并结束查询。
4:下一步是获取对象的分析我们的锁,在查询一个表,第一个服务器将此对象的锁,以保证数据的统一性,如果你不锁,这一数据插入锁,但因为没有理由该查询已被记录有些是因为插入事务回滚失败,就会形成脏读的现象。
下一步是5:数据库用户认证,SQL语句的语法、语义的正确性,这并不一定得到查询结果,如果数据库用户没有相应的访问服务器将向应用提供权限不足的错误,在更大的项目,往往一个项目可以包含多个数据库的连接字符串,数据库的用户拥有不同的权限,或只读访问,只有一些写权限,读写,根据不同用户的不同操作来执行,稍不注意,无论你的SQL语句写的多么完美,十全十美是没有用的。
6最后一步:分析确定最终的执行计划。在语法、语义和权限验证,服务器不会立即返回结果给你,但会优化你的SQL和选择不同的查询算法返回的最有效的方式的应用。例如,在表的查询,服务器将根据使用哈希连接、合并连接的最终决策的成本,或循环连接,通过这一指标将更有效率,但它是通过自动化的优化有限,编写高效的SQL查询或优化你的SQL查询。
执行计划确定后,执行计划将被保存到SQL计划缓存中。下一次,当相同的执行的请求被接受,它将采取直接从计划缓存避免重新编译执行计划。
第三步:句子执行。
当服务器解析SQL语句时,服务器将不知道该语句真正的含义,然后SQL语句被实际执行。
在这一点上,有两种情况
1):如果查询语句中包含的数据行已被读取到数据缓冲区存储区,服务器将直接从数据缓冲存储中读取数据到应用程序,避免读取物理文件并提高查询速度
2):如果数据行不在数据缓冲区存储中,它将从物理文件读取记录到应用程序,并将数据行写入数据缓冲区存储以便下一次使用。
注意:SQL缓存的几个要点,感兴趣的朋友可以去这里搜索,有时因为缓存的存在,使得它很难立即看到结果,因为第二性能由于缓存的存在,会特别快,所以一般都是消除缓冲区中的第一个,然后比较性能优化前后有几种方法
DBCC dropcleanbuffers
从缓冲池中删除所有清除缓冲区。
DBCC freeproccache
进程缓存中删除所有元素。
DBCCFREESYSTEMCACHE
所有未使用的缓存条目都从所有缓存中释放出来。SQL Server 2005数据库引擎将预先清除后台中未使用的缓存条目,以便内存可以用于当前条目。但是,此命令可用于手动删除所有缓存中未使用的条目。
这只能基本上消除SQL缓存的影响。目前,似乎没有办法彻底消除缓存。如果你有,请教。
执行顺序
1。子句返回初始结果集。
2。WHERE子句不包含不满足搜索条件的行。
3。按组子句将选定行收集到组子句中的单个值组中。
每组的聚合值可以用4中指定的聚合函数计算。选择列表。
5。此外,带子句排除不满足搜索条件的行。
6。计算所有表达式;
7。使用顺序对结果集进行排序
8。查找要搜索的字段。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部