查看buffer pool数据密度

我们都知道SQL Server访问的数据会放到Buffer Pool中,但是你知道Buffer Pool中使用的数据密度吗? 如果Buffer Pool中我们要查询数据的密度小,说明很多无用的内存被占用了,导致内存的浪费。 那么如何查看buffer pool中数据的密度呢?

 

SQL Server2005版本中提供了sys.dm_os_buffer_descriptors DMV,使用这个View可以查询到SQL Server 缓冲池中当前所有数据页的信息。 字段free_space_in_bytes追踪了每个页面上的空闲空间,将所有的空闲页面最汇总我们就可以得出数据的密度。

 

下面的脚本可以查看每个数据库占用的Buffer Pool空间以及空数据占用的内存空间。

 

SELECT

(CASEWHEN([database_id]= 32767)

THEN 'Resource Database'

ELSE DB_NAME([database_id])END)AS [DatabaseName],

COUNT(*)* 8/ 1024AS [MBUsed],

SUM(CAST([free_space_in_bytes]ASBIGINT))/(1024* 1024) AS [MBEmpty]

FROM sys.dm_os_buffer_descriptors

GROUP BY [database_id];

GO

 

Resource Database 总共占用了28M的Buffer Pool,其中空的部分为7M。

 

DatabaseName MBUsed MBEmpty

------------------------------------------------------------------------------ -----------------

Resource Database 28 7

 

如果发生有低密度数据可以与sys.allocation_units进行关联可以追踪到每个Object内存使用状况。

 

造成低数据密度的可能原因:

  • 分页
  • 大数据列(比如一张表字段为500个字符,那么就会有3000字节的浪费)
  • 数据删除后空间没有被重用

几种解决办法:

  • 更改表Schema
  • 更改索引列(比如更改为GUID或者identity列)
  • 使用FILLFACTOR减少分页】
  • 定期重建索引或者组织索引
  • 启动数据压缩

 

你可能感兴趣的:(sql,server,buffer,pool)