积极答复者
sqlserver 2008R2企业版、内存占用异常高、数据库性能超慢

问题
答案
-
如果真要使用临时表,我这里有个监控tempdb的脚本,如果服务器在工作状态,尽量不要使用SQL Trace
--监视tempdb的脚本 USE tempdb --每隔一秒运行一次,直到用户手工终止脚本运行 WHILE 1 = 1 BEGIN SELECT GETDATE() --从文件级别看tempdb使用情况 DBCC showfilestats --query1 --返回所有做过空间申请的会话信息 SELECT 'tempdb' AS db , GETDATE() AS TIME , SUM(USER_object_reserved_page_count) * 8 AS user_object_kb , SUM(internal_object_reserved_page_count) * 8 AS internal_object_kb , SUM(version_store_reserved_page_count) * 8 AS version_store_kb , SUM(unallocated_extent_page_count) * 8 AS freespace_kb FROM sys.dm_db_file_space_usage WHERE database_id = 2 --query2 --这个管理视图能够反映当时tempdb空间的总体分配 SELECT t1.session_id , t1.internal_objects_alloc_page_count , t1.user_objects_alloc_page_count , t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count , t3.* FROM sys.dm_db_session_space_usage AS t1 , --反映每个会话累计空间的申请 sys.dm_exec_sessions AS t3 --每个会话的信息 WHERE t1.session_id = t3.session_id AND ( t1.internal_objects_alloc_page_count > 0 OR t1.user_objects_alloc_page_count > 0 OR t1.internal_objects_dealloc_page_count > 0 OR t1.user_objects_dealloc_page_count > 0 ) --query3 --返回正在运行并且做过空间申请的会话正在运行的语句 SELECT t1.session_id , st.text FROM sys.dm_db_session_space_usage AS t1 , sys.dm_exec_requests AS t4 CROSS APPLY sys.dm_exec_sql_text(t4.sql_handle) AS st WHERE t1.session_id = t4.session_id AND t1.session_id > 50 AND ( t1.internal_objects_alloc_page_count > 0 OR t1.user_objects_alloc_page_count > 0 OR t1.internal_objects_dealloc_page_count > 0 OR t1.user_objects_dealloc_page_count > 0 ) WAITFOR DELAY '0:0:1' END
- 已编辑 Steven.桦仔 2012年11月17日 12:49
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40
-
你好,小翔_05382,
如果SQL Server 2008 R2的max server memory设置为默认的话,那么SQL Server会占据它需要的内存来提高性能。所以如果想减少SQL Server占用的内存,我们可以调整max server memory设置。至于你说的
检测数据库插入、更新、查询性能,非常慢,插入大概900条/s。
可能是因为锁,我们可以运行sp_who2
来检查有没有资源被锁定。另外请把你的测试的建表、插入、更新、查询语句列出来。
我们还可以根据下面这篇文档来找出内存瓶颈的原因。
http://www.mssqltips.com/sqlservertip/2304/how-to-identify-microsoft-sql-server-memory-bottlenecks/
微软一站式脚本示例库: http://blogs.technet.com/b/onescript
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40
-
建议运行一下下面的3个语句,然后把结果贴出来。
1,select top 10 name,
2,select single_pages_kb, multi_pages_kb, virtual_memory_reserved_kb, virtual_memory_committed_kb, awe_allocated_kb
type, SUM(single_pages_kb + multi_pages_kb)
AS MemoryKB FROM sys.dm_os_memory_clerks
GROUP BY name, type ORDER BY MemoryKB desc
from sys.dm_os_memory_clerks
where type = 'MEMORYCLERK_SQLBUFFERPOOL'3,DBCC MEMORYSTATUS
Please click the Mark as Answer button if a post solves your problem!- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40
全部回复
-
如果真要使用临时表,我这里有个监控tempdb的脚本,如果服务器在工作状态,尽量不要使用SQL Trace
--监视tempdb的脚本 USE tempdb --每隔一秒运行一次,直到用户手工终止脚本运行 WHILE 1 = 1 BEGIN SELECT GETDATE() --从文件级别看tempdb使用情况 DBCC showfilestats --query1 --返回所有做过空间申请的会话信息 SELECT 'tempdb' AS db , GETDATE() AS TIME , SUM(USER_object_reserved_page_count) * 8 AS user_object_kb , SUM(internal_object_reserved_page_count) * 8 AS internal_object_kb , SUM(version_store_reserved_page_count) * 8 AS version_store_kb , SUM(unallocated_extent_page_count) * 8 AS freespace_kb FROM sys.dm_db_file_space_usage WHERE database_id = 2 --query2 --这个管理视图能够反映当时tempdb空间的总体分配 SELECT t1.session_id , t1.internal_objects_alloc_page_count , t1.user_objects_alloc_page_count , t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count , t3.* FROM sys.dm_db_session_space_usage AS t1 , --反映每个会话累计空间的申请 sys.dm_exec_sessions AS t3 --每个会话的信息 WHERE t1.session_id = t3.session_id AND ( t1.internal_objects_alloc_page_count > 0 OR t1.user_objects_alloc_page_count > 0 OR t1.internal_objects_dealloc_page_count > 0 OR t1.user_objects_dealloc_page_count > 0 ) --query3 --返回正在运行并且做过空间申请的会话正在运行的语句 SELECT t1.session_id , st.text FROM sys.dm_db_session_space_usage AS t1 , sys.dm_exec_requests AS t4 CROSS APPLY sys.dm_exec_sql_text(t4.sql_handle) AS st WHERE t1.session_id = t4.session_id AND t1.session_id > 50 AND ( t1.internal_objects_alloc_page_count > 0 OR t1.user_objects_alloc_page_count > 0 OR t1.internal_objects_dealloc_page_count > 0 OR t1.user_objects_dealloc_page_count > 0 ) WAITFOR DELAY '0:0:1' END
- 已编辑 Steven.桦仔 2012年11月17日 12:49
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40
-
你好,小翔_05382,
如果SQL Server 2008 R2的max server memory设置为默认的话,那么SQL Server会占据它需要的内存来提高性能。所以如果想减少SQL Server占用的内存,我们可以调整max server memory设置。至于你说的
检测数据库插入、更新、查询性能,非常慢,插入大概900条/s。
可能是因为锁,我们可以运行sp_who2
来检查有没有资源被锁定。另外请把你的测试的建表、插入、更新、查询语句列出来。
我们还可以根据下面这篇文档来找出内存瓶颈的原因。
http://www.mssqltips.com/sqlservertip/2304/how-to-identify-microsoft-sql-server-memory-bottlenecks/
微软一站式脚本示例库: http://blogs.technet.com/b/onescript
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40
-
建议运行一下下面的3个语句,然后把结果贴出来。
1,select top 10 name,
2,select single_pages_kb, multi_pages_kb, virtual_memory_reserved_kb, virtual_memory_committed_kb, awe_allocated_kb
type, SUM(single_pages_kb + multi_pages_kb)
AS MemoryKB FROM sys.dm_os_memory_clerks
GROUP BY name, type ORDER BY MemoryKB desc
from sys.dm_os_memory_clerks
where type = 'MEMORYCLERK_SQLBUFFERPOOL'3,DBCC MEMORYSTATUS
Please click the Mark as Answer button if a post solves your problem!- 已标记为答案 Amy PengMicrosoft employee, Moderator 2012年11月30日 1:40