在进行软件开发的过程中我们可能会遇到这种情况:服务器启动时调用一些方法,这些方法只用来执行某些查询功能的sql语句,这就是所谓的“数据初始化”操作。要知道进行这一操作的好处则必须要知道程序执行SQL的内部工作流程:
        第一步:程序将查询功能的SQL语句发给服务器端执行。在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。
        第二步:服务器解析请求的SQL语句:
                       1、SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实:往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。    
                             原因:
                                     1):服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划,如果存在就直接调用已经编译好的执行计划以节省执行计划的编译时间。
                                     2):如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率。
                       2、如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给调用它的应用程序。

注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select 写成selec等, SQL语句中如果包含表中没有的字段,此时服务器是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。
                       3、语法符合后,就开始验证它的语义是否正确,例如表名、列名、存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。
                       4、接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入由于没有加锁,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,这样就会形成脏读的现象。
                       5、接下来就是对数据库用户权限的验证,SQL语句语法和语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户来执行,稍微不注意,无论SQL语句写的多么完美无缺都没用。
                      6、解析的最后一步就是确定最终的执行计划。当语法、语义和权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序。例如在做表联合查询时,服务器会根据开销成本来最终决定采用hash join、merge join还是loop join,不过数据库服务器的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。当确定好执行计划后会把这个执行计划保存到SQL计划缓存中,如果下次在有相同的执行请求时,就直接从计划缓存中取,从而避免了重新编译执行计划。

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

1、如果查询SQL语句所包含的数据行已经读取到数据缓冲存储区的话,服务器会直接从数据缓冲存储区中读取数据返回给应用程序,从而避免了从物理文件中读取,这样提高了查询速度。
                      2、如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。
                     说明:SQL缓存分好几种,这里有兴趣的朋友可以去搜索一下,有时因为缓存的存在,使得我们很难马上看出优化的结果,因为第二次执行有缓存存在,会特别快速,所以一般都是先消除缓存,然后比较优化前后的性能表现,这里有几个常用的方法:
                              DBCC DROPCLEANBUFFERS   从缓冲池中删除所有清除缓冲区。
                              DBCC FREEPROCCACHE      从过程缓存中删除所有元素。
                              DBCC FREESYSTEMCACHE    从所有缓存中释放所有未使用的缓存条目。

SQL Server 2005 数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。这只能基本消除SQL缓存的影响,目前好像没有完全消除缓存的方案,如果大家有,请指教。

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

数据库中数据数据初始化的好处相关推荐

  1. c从sqlite3数据库中获取数据,并对数据进行拼接

    c从sqlite3数据库中获取数据,并对数据进行拼接 函数功能 对数据库的操作 创建数据库: 创建USER表: 创建表内数据: 查看表内数据: 查看表结构: 函数实现 函数编译: 函数结果: 函数功能 ...

  2. flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...

    看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...

  3. java实现k-means算法(用的鸢尾花iris的数据集,从mysq数据库中读取数据)

    k-means算法又称k-均值算法,是机器学习聚类算法中的一种,是一种基于形心的划分方法,其中每个簇的中心都用簇中所有对象的均值来表示.其思想如下: 输入: k:簇的数目: D:包含n个对象的数据集. ...

  4. 通过VB向SQL Server数据库中录入数据

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 一.数据录入 通过VB向SQL Se ...

  5. Flask 提取数据库中的数据

    近日有需求,想查询和 flask 连接的数据库,并且把数据读出来 查询数据很好处理,但是想要提取数据就感觉有点无从下手 直接百度 "flask提取数据库中的数据" 找到的也是基于 ...

  6. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等

    Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...

  7. 基于JDBC从数据库中读取数据,在百度地图批量标注地点

    基于JDBC从数据库中读取数据,在百度地图批量标注地点 一.相关技术 JSP,JDBC,JSON,JS,百度地图API 二.基于JDBC从数据库读取数据 见"JSP基于JDBC操作MSSQL ...

  8. 利用ECharts可视化mysql数据库中的数据

    利用ECharts可视化mysql数据库中的数据 技术实现背景 在我们的日常开发中我们经常使用到各种各样的数据进行相关的功能的开发,在这个过程中我们可以用到各种各样的图表来分析和实现我们的需求,很多的 ...

  9. eclipse给mysql修改表数据_Eclipse中java向数据库中添加数据,更新数据,删除数据...

    ASP.NET网页动态添加.更新或删除数据行 看过此篇 http://www.cnblogs.com/insus/p/3247935.html的网友,也许明白Insus.NET是怎样实现动态添加数据行 ...

  10. 用java向mysql数据库中插入数据为空

    利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...

最新文章

  1. java使用链栈实现迷宫求解
  2. 网络编程学习笔记(gethostname函数)
  3. airpods有时能连上有时连不上怎么办?
  4. 笛卡尔集基本原理,等值连接,不等值连接,外连接,自连接
  5. 开源PCRF、PCRF体验与PCRF实现
  6. 常用工具类系列之DateUtil
  7. 监视程序中的死锁及其他
  8. windows查找端口占用并杀死端口进程
  9. Linux - xshell上传文件报错乱码
  10. Ext.grid.GridPanel + asp.net 数据分页
  11. [Android] 环境优化配置Android Studio发展NDK
  12. 理解并取证:IPv6与IPv4在报文结构上的区别
  13. GUI编程(一)-----概述
  14. select下拉框option默认选中(php模板渲染)
  15. 偏心率计算公式matlab,结构计算整体指标(3)——扭转位移比及楼层偏心率
  16. Android基础教程学习(一)
  17. GitLab 注册 Runner Registering Runners
  18. mysql 存储视频_数据库中怎样存储视频?谢谢各位
  19. Unity学习笔记:Animator、Animator Controller、Animation Cilp之间的关系、以及Blend Tree的用法;
  20. vue复制图片到剪切板

热门文章

  1. RunLoop 原理和核心机制
  2. 【随便唱唱】猫的报恩-幻化成风
  3. ASP.NET 中的 SQL Server 应用服务数据库角色和视图
  4. CentOS 7 安装中文环境
  5. 《Kotlin项目实战开发》第1章 Kotlin是什么 1
  6. RHEL6与Oracle 11G R2之开篇:安装
  7. 谈谈主策划需要的能力
  8. 20.Linux 账号管理与 ACL 权限设置
  9. 51. 移除重复脚本(12)
  10. 循序渐进之Spring AOP(3) - 配置代理