SQL Server应用程序的查询是对内存的一种浪费?

数据库 SQL Server
以下的文章主要向大家描述的是SQL Server应用程序的查询是否在浪费内存的探讨,以下就是文章的主要内容的详细解析。

我们今天主要与大家一起探讨的是SQL Server应用程序的查询是否在浪费内存的探讨,在实际操作中或许在SQL Server数据库的应用程序代码中会找到的最常见的错误就是想、类似缘故这样的查询请求:

它不是使用准备好的查询或程序,而是使用非参数特设的查询从数据库中请求数据。

 

不准备你的查询或者不使用存储过程会增加不必要的SQL Server计划缓存。什

 

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

 

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

 

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

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

 

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

 

 

注意:下面的查询输出结果被修改成只显示文本字段中的相应资料。

 

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

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

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

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

虽然相对于使用非参数特设的查询请求来说,准备好的查询是一种更好的方法,但是比起这两种方法,我个人更偏向于使用存储过程。允许直接访问你的核心数据库表存在安全风险,通过存储过程把数据从逻辑中抽取出来可以减少维护,并且当业务需求变化时,它也能够减少数据模型的变化。

无论你选择哪种数据访问方法,请记住通过确保你的查询计划是可以重复利用的,从而把你的SQL Server应用程序从潜在的内存和CPU问题中解救出来。

 

【编辑推荐】

  1. SQL ServerCoalesce的大量使用的具体描述
  2. SQL Server数据库的N多注意事项
  3. SQL Server数据库的妙招用法
  4. SQL Server数据转换服务的妙招之一
  5. SQL Server性能进行提高的4项技术概述

 

责任编辑:佚名 来源: 人民邮电出版社
相关推荐

2010-06-30 08:41:21

SQL Server嵌

2009-04-02 10:26:27

2023-08-16 19:05:59

2011-03-30 11:15:35

SQL Server数应用程序

2010-07-14 13:14:01

SQL Server数

2018-03-09 10:09:07

程序媛体验女生

2018-06-20 16:10:20

WindowsWindows 10应用程序

2021-05-27 06:56:09

Linux运维Linux系统

2009-01-08 19:14:37

服务器应用程序SQL Server

2015-11-03 08:51:21

程序员怪物

2013-03-11 10:37:08

2018-02-26 09:28:42

程序员Bug体验

2021-02-23 15:18:27

程序员国企工程师

2018-12-29 10:37:05

HTTP缓存URL

2015-08-03 09:36:01

赛迪翻译

2015-08-31 09:27:21

语言界面UI

2015-01-21 15:35:58

开源

2018-03-10 07:39:06

2021-05-17 07:45:06

Linux系统程序

2023-01-26 23:46:15

点赞
收藏

51CTO技术栈公众号