SQL Server查询过程的内存实际消耗

2016-02-19 16:05 5 1 收藏

下面图老师小编要跟大家分享SQL Server查询过程的内存实际消耗,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

  或许在应用程序代码中找到的最常见的错误就是这样的查询请求:它不是使用准备好的查询或程序,而是使用非参数特设的查询从数据库中请求数据。

  不准备你的查询或者不使用存储过程会增加不必要的SQL Server计划缓存。什么是计划缓存呢?简单地说,它是SQL Server共享内存池的一部分,在这里,解析、编译和执行优化这些查询之后,查询执行计划仍被保存。无论何时执行一个查询,内存的这个区域都会被查找,以便确定现有的一个计划是否可以重新使用来满足一个查询请求。重新使用计划为数据库引擎节约了潜在的CPU密集工作,例如,如果唯一的不同点是WHERE从句中正在使用的值,我们不得不一次又一次重新解析,重新编译,重新优化查询。这将导致查询响应时间加快,服务器中的CPU压力降低。

  下面的Java代码片断提出一系列非参数特设查询到AdventureWorks数据库中,以此来获得用户销售订单数据。它通过循环,从AdventureWorks SalesOrderHeader表中前20张订单中获得信息。

图一

  让我们用SQL Server 2005 DMVs来检验计划缓存中特设查询的效果。

select qs.usecounts, cacheobjtype, objtype, qt.text
from sys.dm_exec_cached_plans qs
cross apply sys.dm_exec_sql_text(qs.plan_handle) as qt
order by qt.text
go

  运行查询之后,我们可以从下面的图中看到,每一个查询执行都在内存中存储了一个非常具体的计划,该计划没有参数化,也没有被数据库引擎重新利用。因为这些计划是如此的具体,所以任何这些计划能够被重新使用的可能性很小。很容易看到,如果这是一个使用频率非常高的应用程序,那么服务器内存会很快地消耗。

图二

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  现在将调整Java代码来准备这个查询语句。在执行之前,我通过命令DBCC FREEPROCCACHE清除该计划缓存,接着通过一个准备好的语句重新运行java class:

图三

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  重新审视这个计划缓存,我们可以看到,该查询已经成功编译并且重新用于所有的执行,因此有效地使用和保存服务器内存和限制CPU使用。

图四

  现在,考虑到由于计划缓存是内存共享池的一部分,那么消除多余的计划可以为其他缓存腾出更多可用内存,从而使其他的缓存可以使用这个共享池,比如存储已经从硬盘中读取到内存中的数据和索引页的SQL Server数据缓存。

  虽然相对于使用非参数特设的查询请求来说,准备好的查询是一种更好的方法,但是比起这两种方法,我个人更偏向于使用存储过程。允许直接访问你的核心数据库表存在安全风险,通过存储过程把数据从逻辑中抽取出来可以减少维护,并且当业务需求变化时,它也能够减少数据模型的变化。无论你选择哪种数据访问方法,请记住通过确保你的查询计划是可以重复利用的,从而把你的应用程序从潜在的内存和CPU问题中解救出来。

来源:http://www.tulaoshi.com/n/20160219/1611020.html

延伸阅读
标签: SQLServer
由于XML本身的诸多优点,XML技术已被广泛的使用,目前的好多软件技术同XML紧密相关,比如微软的。net 平台对xml提供了强大的支持,提供System.Xml以及其子命名空间下的类型来操作xml.Ado.net通过核心类型DataSet出色的把关系型数据库同xml进行了紧密集成。由于平常许多开发人员使用。net 来操作Sql server的到数据集后再转换成xml,所以往往忽略...
可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在Microsoft SQL Server启动时自动运行的存储过程。 语法 CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECO...
相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。 在SQL Server 2000中FOR XML查询的结果是直接以文本方式返回到客户端,为支...
标签: SQLServer
  SQLSERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能直接将结果输出。给你这个权限,也不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击...
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的。 从表面上看,查询性能的调节是一件十分简单的事。从本质上讲,我们希望查询的运行速度能够尽可能地快,...

经验教程

195

收藏

39
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部