分享
 
 
 

您的SQL Server应用程序查询正在浪费内存吗?

王朝mssql·作者佚名  2008-12-04
窄屏简体版  字體: |||超大  

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

不准备你的查询或者不使用存储过程会增加不必要的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

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

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

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有