我们都知道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减少分页】
- 定期重建索引或者组织索引
- 启动数据压缩
本文转自 lzf328 51CTO博客,原文链接:http://blog.51cto.com/lzf328/1002161