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

EI9A7J

EI9A7J

2016-02-19 16:05

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

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

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

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

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

图一

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

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

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

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

图二

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

图三

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

图四

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

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
SQL Server查询过程的内存实际消耗

冗长的SQL Server查询将消耗你的CPU

编程语言 网络编程
冗长的SQL Server查询将消耗你的CPU

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

改善SQL Server内存管理

SQLServer
改善SQL Server内存管理

SQL SERVER 查询正在实行的SQL语句

编程语言 网络编程
SQL SERVER 查询正在实行的SQL语句

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

为SQL Server提供更多的内存

编程语言 网络编程
为SQL Server提供更多的内存

解决 SQL Server 耗尽内存的情况

编程语言 网络编程
解决 SQL Server 耗尽内存的情况

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

win10系统升级后部分程序软件显示模糊怎么办

win10系统升级后部分程序软件显示模糊怎么办

使用CHECK约束执行业务规则

使用CHECK约束执行业务规则
下拉加载更多内容 ↓