`
gcq04552015
  • 浏览: 457841 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

应用程序的SQL查询原理

 
阅读更多
作为B/S架构的开发人员,总是离不开数据库,一般开发员只会应用SQL的四条经典语句:select ,insert,delete,update。但是我从来没有研究过它们的工作原理,这篇我想说一说select在数据库中的工作原理。B/S架构中最经典的话题无非于三层架构,可以大概分为数据层,业务逻辑层和表示层,而数据层的作用一般都是和数据库交互,例如查询记录。
我们经常是写好查询SQL,然后调用程序执行SQL。但是它内部的工作流程是怎样的呢?先做哪一步,然后做哪一步等,我想还有大部分朋友和我一样都不一定清楚。 

第一步:应用程序把查询SQL语句发给服务器端执行。

我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。

第二步:服务器解析请求的SQL语句。

1:SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。

原因:

1):服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划,如果存在,就直接调用已经编译好的执行计划,节省了执行计划的编译时间。

2):如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率.数据缓冲存储区会在后面提到。



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

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

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

4:接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成脏读的现象。

5:接下来就是对数据库用户权限的验证,SQL语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户来执行,稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。

6:解析的最后一步,就是确定最终的执行计划。当语法,语义,权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序。例如在做表联合查询时,服务器会根据开销成本来最终决定采用hash join,merge join ,还是loop join,采用哪一个索引会更高效等等,不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。
当确定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免重新编译执行计划。

第三步:语句执行。

服务器对SQL语句解析完成后,服务器才会知道这条语句到底表态了什么意思,接下来才会真正的执行SQL语句。
些时分两种情况:

1):如果查询语句所包含的数据行已经读取到数据缓冲存储区的话,服务器会直接从数据缓冲存储区中读取数据返回给应用程序,避免了从物理文件中读取,提高查询速度。

2):如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。

说明:SQL缓存分好几种,这里有兴趣的朋友可以去搜索一下,有时因为缓存的存在,使得我们很难马上看出优化的结果,因为第二次执行因为有缓存的存在,会特别快速,所以一般都是先消除缓存,然后比较优化前后的性能表现,这里有几个常用的方法:

DBCC DROPCLEANBUFFERS

从缓冲池中删除所有清除缓冲区。

DBCC FREEPROCCACHE

从过程缓存中删除所有元素。

DBCC FREESYSTEMCACHE

  从所有缓存中释放所有未使用的缓存条目。SQL Server 2005 数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。

这只能基本消除SQL缓存的影响,目前好像没有完全消除缓存的方案,如果大家有,请指教。

结论:只有知道了服务执行应用程序提交的SQL的操作流程才能很好的调试我们的应用程序。
1:确保SQL语法正确;
2:确保SQL语义上的正确性,即对象是否存在;
3:数据库用户是否具有相应的访问权限。
分享到:
评论

相关推荐

    计算机病毒与防护:SQL注入原理.ppt

    * * 目录页 SQL注入原理 SQL注入的原理 动态页面有时会通过脚本引擎将用户输入的参数按照预先设定的规则构造成SQL语句来进行数据库操作,SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,改变原有的...

    SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    SQL注入的原理是攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,从而绕过应用程序的安全机制,直接对数据库进行查询或操作。当应用程序没有对用户输入进行适当的验证和过滤时,攻击者可以注入恶意的...

    数据库原理 SQL 应用程序和介绍

    基本的数据库介绍和演示程序 适合新手 可以进行自学和测试

    数据库原理与应用(SQL Server 2005)-黄存东-源代码

    课程:数据库原理与应用(SQL Server 2005) 作者:黄存东 类型:例题源代码

    绿色sqlserver原理

    Sql Server的启动可以为Windows服务方式(默认),也可以以应用程序方式启动。下面介绍sqlservr.exe以应用程序方式启动时的参数问题。

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

     本书适合于专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际...

    数据库原理及应用-第8章数据库编程.pdf

    数据库原理及应用 Database Principle and Application 第八章 数据库编程 第八章 数据库编程 8.1 嵌入式SQL 8.2 存储过程 8.3 ODBC编程 8.4 小结 8.1 嵌入式SQL 这两种方式细节上有差别,在程序设计的环境下, SQL...

    数据库SQL SELECT查询的工作原理

    作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库。一般开发员只会应用SQL的四条经典语句:select,insert,delete,update。...第一步:应用程序把查询SQL语句发给服务器端执行 我们在数据层执行S

    SQL注入攻击原理分析及JavaWeb环境下的防范措施.pdf

    使应用程序存在安全隐患,任何用户可以提交一段数据库查询代码,并根据程序返回的结果,获得某些他想得知的数据,造成用户可以在输入中包含恶意代码篡改程序功能。更严重的用户还可能窃取最高管理权限,删除数据库中...

    SQLTracker,抓取sql语句的工具

    SQLTracker,非常好用的抓取sql语句的工具,可以再没有源码的情况下抓取出执行的SQL语句。

    绿色 Sql Server 原理及全新管理工具

    sqlservr 应用程序用法:sqlservr [-sinstance_name] [-c] [-dmaster_path] [-f] [-eerror_log_path] [-lmaster_log_path] [-m] [-n] [-Ttrace#] [-v] [-x] [-g number] [-O] [-y number]-sinstance_name 指定要连接...

    SQL注入全面讲解技术文档

    3.SQL Server应用程序中的 高级SQL注入 19 4.编写通用的ASP防SQL注入攻击程序 22 5.利用instr()函数防止SQL注入攻击 23 6.跨站式SQL注入技巧 25 7. 防范Sql注入式攻击 27 8.PHP与SQL注入攻击 29 9.SQL注入攻击零距离...

    数据库原理与应用:第7章 Transact-SQL程序设计.ppt

    数据库原理与应用:第7章 Transact-SQL程序设计.ppt

    数据库嵌入式SQL介绍与应用

    1.1 嵌入SQL程序的组成元素 3 1.2 什么是静态SQL和动态SQL? 4 1.3 什么是SQLCA? 4 1.4 什么是SQLDA? 5 第二节 SYBASE SQL SERVER嵌入式SQL语言 5 2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 ...

    SQL SERVER 2000开发与管理应用实例

    7.1 应用程序中的分页处理 205 7.2 数据库中的分页处理 207 7.2.1 使用TOP N实现分页 207 7.2.2 使用字符串 211 7.2.3 使用临时表 213 7.2.4 使用SQL Server的系统存储过程处理分页 216 7.3 特殊...

    (文摘)SQLMail的原理及实际应用

    过程,使得SQLServer可以通过基于WindowsNT内部的消息应用编 程界面(MAPI)的客户机邮件程序接收和发送邮件消息。SQLMa il可发送的消息包括文本串,附加文件或SQL语句的执行结果 集。应用SQLMail的扩展存储过程...

    北邮 数据库系统原理(SQL Server版) 实验四

    2.利用C语言(或其它支持ODBC接口的高级程序设计语言)编程实现简单的数据库应用程序,掌握基于ODBC的数据库访问的基本原理和方法。 3.尝试使用SQL Server上的工具以特定格式导出数据,初步了解现代程序设计辅助工具...

    数据库系统原理与开发-数据库连接技术(ODBC).pdf

    数据库系统原理与开发 电子科技大学-陈安龙 三、ODBC的层次结构 ODBC应用程序接口 客户端数据库应用程序 ODBC驱动程序管理器 驱动程序1 驱动程序2 驱动程序n 数据源1 数据源2 数据源n Oracle DBMS PostgreSQL DBMS ...

    数据库原理及应用课件

    具体内容包括安装和配置SQLServer、在SQLServer环境中创建数据库和表、安全管理、数据传输、备份和恢复、数据库的应用程序和数据库访问技术、VisualBasic6^的ADO数据控件技术等。 本书可作为高校非计算机专业本、...

Global site tag (gtag.js) - Google Analytics