Analysis Memory In Sqlserver

数据库内存浅析

内存是数据库一个非常大的主题,可是说是影响数据库性能的关键因素之一,

这几天研究了下,不是很深,与大家分享下。

初识数据库内存

内存存在的意义在于协调高速的CPU和低速的磁盘之间的读写差距,对数据库而言,

内存中的数据越多意味着读写更快、性能更好。当然,在服务器上不可能给你无限制的内存,

这就需要我们合理配置数据库内存,以达到最佳性能。

在SQL Server数据库中,通过数据库的SSMS管理界面可以看到数据库有个内存设置选项,如图:

下面将详细分析数据库的内存:

最小内存

上图可以看到数据库有个最小内存选项,默认是0,当然也可以设置成其他值,

当设置成某个具体值时,比如2G,,每次数据库引擎启动时并不会马上达到数据库的最小内存,

如果没有负载,可能永远达不到,如果没有任何负载,sqlserver 2008 r2的内存占用100M不到。如下图:

既然这样,那设置最小内存是不是没有意义了呢,

其实不然,一旦数据库负载达到最低内存后,就不会再低于这个值,就算操作系统向其索要也不会释放(重启除外)。

我们试想没有这个机制,当没有业务时数据库的内存非常低,一旦负载起来,数据库就向操作系统申请内存,这种情况会反复出现,

对性能有影响,更重要的是,当数据库申请时不见得操作系统有多余的内存分配给数据库,这时数据库就只能歇菜了。

因此合理设置数据库的最低内存也是十分重要的。下图是微软建议的最小内存值,应该是服务器总内存减去1-2G。

引用于:http://msdn.microsoft.com/en-us/library/ms178067.aspx

最大内存

如果没有设置最大内存,数据库采用自动分配内存的方式,当负荷加重时,会不断向操作系统申请可用内存,

直到操作系统为自身保留内存的最小内存为止,

需要注意的是:在32位的环境中,操作系统能直接寻址的内存只有4G,

默认情况下操作系统将预留2G,剩下2G分配给应用程序。

也就是说,即使设置了最大内存,数据库也无法使用超过2G的内存。

这种方式肯定无法在很多生产环境中使用,于是微软为32位系统提供了临时解决方案,

也就是通过启用3G开关(在启动文件中设置),这样可以值给操作系统预留1G内存,使得应用程序使用3G的内存。

但这也不是长久之计。这对一个数据库而言肯定不够,一般数据库使用的内存在4G、8G甚至更大,

那如何能让操作系统支持大于4G的内存呢,如何又使得数据库支持更大的内存呢?

如果要实现数据库支持大于2G的内存甚至达到4G、8G更大内存时,从上文的分析中也可以看到,需要解决两个问题:

1)、在32位系统如何支持大于4G的内存

2)、如何使得数据库使用大于4G的内存

对于第一个问题,微软为企业版的操作系统提供了一个类似/3G开关的机制,也就是/PAE(也是在启动文件中设置)

这种方式可以使得32位企业版的操作系统支持到64G的内存,

需要注意的是这没有改变只能直接寻址4G内存的事实,只是将现有的4G内存分区,

将一部分空间指向到大于4G的内存区域,类似C语言的指针机制。

这样第一个问题解决了,那第二个问题呢,如何使得32位的数据库使用大于4G的内存?

如下图:

勾选AWE(地址窗口扩展),这就运行数据库使用大于2G的内存了。

需要注意的是:当同时开启/pae和数据库awe时,操作系统只能识别到16G的最大内存。

上文讨论了32位系统,那64位系统怎么办呢,

很显然,64位系统根本就不需要考虑这个问题,因为64已经可以支持直接寻址2T的内存,

当然,64位的SQL Server也完全没有开启AWE(你可以开启,数据库会忽略该选项)

那么是不是64位系统就不需要做任何设置了呢?

其实不然,为了保证数据库能够使用windows特性来将数据保持在物理内存中:需要将数据库启动的用户锁定内存页面,

从而防止操作系统将数据分页到磁盘上的虚拟内存中。通常建议在64位的环境启用该策略。

如下图:

时间: 2024-10-28 06:54:45

Analysis Memory In Sqlserver的相关文章

自动部署SQL Trace和Windows性能监视器

问题引出 自从菜鸟的上一篇<如何分析SQL Server Trace文件>文章以后,老鸟对菜鸟是另眼相看:"鸟哥,上篇文章你总结得还不错,当然要赶上我还有点距离".老鸟还是改不了他得意忘形的模样:"关于Trace文件的自动化分析你研究透了,那怎么自动化部署SQL Trace和Windows性能监视器,你也得研究研究吧". "虽然老鸟骄傲自满的样子让人讨厌,但是这个问题还是问的很不错的.",于是乎,菜鸟领了任务,便开始埋头苦干起来. 自

weblogic oom分析-weblogic内存溢出outofmemory日志分析

问题描述 weblogic内存溢出outofmemory日志分析 软件环境: aix 6.1+weblogic10.3+oracle11系统每天同时在线人数100左右,数据库的数据量有多张频繁操作的表数据记录在千万以上,主要后台自动处理线程过多.系统前段时间运行一直正常,只是从7月底出现OOM最近差不多半个月出现一次.对weblogic产生的phd文件和javacore文件分析的不太清楚...以下是javacore的日志: WARNING Java heap is almost exhauste

.net性能测试和优化2 Profiling和提高的一些参考

Application Profiling Using profiling tools to look for potential bottlenecks during development can significantly reduce the number of problems that show up later. With the right tools and training, this can become a regular part of the development

SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息

在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统相关信息.如有不足和遗漏,敬请补充.谢谢! 一:查看数据库服务器CPU的信息 ---SQL 1:获取数据库服务器的CPU型号 EXEC xp_instance_regread 'HKEY_LOCAL_MACHINE', 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'Pro

java环境连接sqlserver Analysis Service?

问题描述 java环境是否可以通过jdbc连接sqlserverAnalysisService里面的database?

perf Performance analysis tools for Linux

perf是基于内核子系统的一个性能分析框架,包括硬件层面(cpu/pmu)和软件级的性能分析. man perf PERF(1) perf Manual PERF(1) NAME perf - Performance analysis tools for Linux SYNOPSIS perf [--version] [--help] COMMAND [ARGS] DESCRIPTION Performance counters for Linux are a new kernel-based

浅谈优化SQLServer数据库服务器内存配置的策略

server|sqlserver|策略|服务器|数据|数据库|优化 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于WindowsNT4.0平台,采用客户/服务器模式,以Microsoft SQL Server为基础建立起来的大型数据库应用程序,系统界面友好.操作简便,计算.分析.检索功能非常强大,为保证农业银行系统及时进行纵向和横向业务数据采集.按照不同要求生成统计报表,进行全面业务活动分析提供了强有力的保障.但在这套程序的推广.维护中笔者发现系统有时运行速度较

大内存SQLServer数据库的加速剂

为数据库配置比较大的内存,可以有效提高数据库性能.因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存.通常情况下,用户访问数据库时,数据先会被读取到这个数据缓存中.当下次用户还需要访问这个数据时,就会从这个数据缓存中读取.因为在数据缓存中读取数据要比在硬盘上读取数据快几百倍.所以扩大数据库服务器内存,可以有效提高数据库性能,特别是操作大型数据库时效果更加明显. 但是,现在企业中普遍采用的数据库服务器都是32位的操作系统.而这个32位的操作系统却有最大内存的使用限制.通常情况下,标准的3

SQLSERVER数据库备份后无法还原的解决办法

有时候为了考虑数据安全我们都会备份数据库,sqlserver的备份格式一般都是bak结尾的,但覆盖时容易出问题,这里简单介绍下,需要的朋友可以参考下   有时候完全备份, 当还原的时候说不时数据库文件不让还原, 解决办法: 可以直接复制数据库文件, xxx.mdf 和 xxx.ldf (实际复制过程中需要先停止sqlserver服务才可以) 用 sp_attach_db 存储过程 就能搞定. 示例 下面的示例将 pubs 中的两个文件附加到当前服务器. EXEC sp_attach_db @db