导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

为什么内存占用这么大

zat1978 2003-12-18 11:26:20
我的sql server 中有一个库,有50w记录的一个表,做了一个全文检索目录.每当进行完增量填充之后内存就占到600多M甚至700多,而且填充玩之后也不会降回来,到底为什么啊??
...全文
177 点赞 收藏 3
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2003-12-19


内存:
企业管理器->服务器->属性->内存->使用固定的内存大小

ZT:

看看MSSQL是怎样使用内存的。
最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。
其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。
所以用于关联和排序的列上一般需要有索引。
再其次就是对执行计划、系统数据的存储,这些都是比较小的。

我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据pin在高速缓存中。但是如果有其它应用程序,虽然在需要的时候MSSQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。这样我们就必须设置MSSQL的最大内存使用。可以在SQL Server 属性(内存选项卡)中找到配置最大使用内存的地方,或者也可以使用sp_configure来完成。如果没有其它应用程序,那么就不要限制MSSQL对内存的使用。

然后来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引。

回复
happydreamer 2003-12-19
SQL Server 缓冲存储器

一 工作原理

SQL Server为每个实例建立一个列表,包括供该实例使用的页地址. 这些页构成了缓冲存储器.
第一次启动SQL Server时缓存的所有页面都是空闲的. 随着处理的开始,调度进程将陆续从磁盘调入
页面保存在缓冲存储器的中。如果其他进程需要读入或修改页面,就可以在缓冲存储器中进行,不需
要执行对磁盘的I/O操作. 通过访问内存中的页面, 缓冲存储器将加速读写操作,占用更少的资源.

缓冲页面头信息包含了一个访问计数器和脏页面指示器. 脏页面表示该页面在缓冲中被修改了但还没有写回磁盘. 缓冲中页面每被访问一次,计数器将自动加1. SQL Server 会定期扫描缓冲存储器,并将计数器除4取整. 如果除法的结果为0,就表示在最后一次扫描后,该页面的访问次数少于3次,系统将检查脏页面指示器:

如果该页面被修改,其修改结果将被写回磁盘,脏页面指示器被置位,然后把这个页面加入空闲列表中
如果该页面只被访问过,系统将释放该页面,不需要写回磁盘

SQL Server在Win NT或2000中运行时,将由一个扫描工作线程在排定一个异步读操作和该操作完成的时间间隔之间完成扫描缓冲存储器。扫描线程也会将脏页面写回磁盘中并将该页面添加到空闲列表中。这些写操作也是异步的,不会影响线程完成异步读操作。

系统还有一个叫Lazy Writer惰性写线程的线程,负责定期检查空闲缓冲列表中可供使用的空闲缓冲页数是否已经降到了特定大小。如果空闲列表的空闲缓冲页数已经少于特定的大小,Lazy Writer线程将扫描缓存,回收没有被使用的页面并且释放脏页面。在Win NT或2000系统中,Lazy Writer线程并没有太多的工作,绝大多数的工作都是由以上所介绍的扫描线程完成的,只是在I/O密集的系统中,将需要Lazy Writer线程帮助维护空闲列表,由于在Win98不支持异步写操作,Lazy Writer必须完成释放缓冲页面和将脏页面写回磁盘,扫描线程将帮助回写修改过的缓冲页面,但不会释放这些页面.



二 如何监视SQL Server缓冲存储器

通过Win2000管理工具的性能监视器可以查看以下对象

1) SQL Server Buffer Manager Object,Buffer Cache Hit Ratio counter
(缓冲管理器对象,缓冲存储器命中率计数器)
一个良好的系统具有90%或者更高的缓冲区缓存命中率,如果你的缓冲区缓冲命中率很低,可以给SQLServer 分配更多的内存

2) SQL Server Buffer Manager Object, Free Pages 空闲页计数器
看这个数值是否持续低于5MB,即640个页(SQL Server以8KB为一页),如果不能维持在这个值左右,说明需要为SQL Server分配更多的内存

3) SQL Server Buffer Manager Object, Procedure cache pages (过程缓存页)
用于存储以编译过的存储过程的页数目
回复
gmlxf 2003-12-18
解决MSSQL占用过多内存的简单方法

经常看见有人问,MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢?
  
  首先,我们来看看MSSQL是怎样使用内存的。

  最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。

  其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。

  所以用于关联和排序的列上一般需要有索引。

  再其次就是对执行计划、系统数据的存储,这些都是比较小的。

  我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据pin在高速缓存中。但是如果有其它应用程序,虽然在需要的时候MSSQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。这样我们就必须设置MSSQL的最大内存使用。可以在SQL Server 属性(内存选项卡)中找到配置最大使用内存的地方,或者也可以使用sp_configure来完成。如果没有其它应用程序,那么就不要限制MSSQL对内存的使用。

  然后来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告