none
sqlserver 2008R2企业版、内存占用异常高、数据库性能超慢 RRS feed

  • 问题

  • 一台win2008r2的联想680机架服务器,4CPU 24核,32g内存,系统检查没有病毒,采用sqlserver 2008R2企业版做数据库,数据库一装好,内存直接飙升至27G,检测数据库插入、更新、查询性能,非常慢,插入大概900条/s。

    检测方法:建临时表增删改数据。

    2012年11月17日 9:34

答案

  • 如果真要使用临时表,我这里有个监控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


    给我写信: QQ我:点击这里给我发消息


    2012年11月17日 12:48
  • 你好,小翔_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

    2012年11月20日 7:13
  • 建议运行一下下面的3个语句,然后把结果贴出来。

    1,select top 10  name,
       type, SUM(single_pages_kb + multi_pages_kb)
       AS MemoryKB FROM sys.dm_os_memory_clerks
       GROUP BY name, type ORDER BY MemoryKB desc 

    2,select single_pages_kb, multi_pages_kb, virtual_memory_reserved_kb, virtual_memory_committed_kb, awe_allocated_kb
    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!

    2012年11月20日 10:45

全部回复

  • 使用建临时表增删改数据来检测性能吗?

    tempdb数据库放在固态硬盘还是磁盘阵列,放tempdb数据库的磁盘空间够不够大,容纳你的那么多数据的插入

    因为tempdb存放数据库里的所有临时结果集中间结果哈希联接操作的工作文件,临时大型对象存储工作表,所以测试最好不要使用临时表


    内存直接飙升至27G,是不是服务器还有其他的程序在运行,要使用那么多内存?


    给我写信: QQ我:点击这里给我发消息

    2012年11月17日 12:43
  • 如果真要使用临时表,我这里有个监控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


    给我写信: QQ我:点击这里给我发消息


    2012年11月17日 12:48
  • 一装好就27G RAM占用,这明显是异常

    Tempdb若空间不够,则根本不能插手或更新,而不是快慢问题

    既然这么强悍的SVR,空间肯定会够。。只有监测SVR and SQL和一步步找原因


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2012年11月19日 1:05
  • Is it 64-bit machine? What's max memory setting in sql?
    2012年11月19日 3:08
  • 一装好, 是指没有任何业务应用(程序连接)的情况下就如此了么?

    2012年11月19日 3:37
  • 你好,小翔_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

    2012年11月20日 7:13
  • 建议运行一下下面的3个语句,然后把结果贴出来。

    1,select top 10  name,
       type, SUM(single_pages_kb + multi_pages_kb)
       AS MemoryKB FROM sys.dm_os_memory_clerks
       GROUP BY name, type ORDER BY MemoryKB desc 

    2,select single_pages_kb, multi_pages_kb, virtual_memory_reserved_kb, virtual_memory_committed_kb, awe_allocated_kb
    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!

    2012年11月20日 10:45
  • 数据库一装好,内存直接飙升至27G;  大家搞的好复杂,为什么不找硬件工程师帮忙!

    这种问题做硬件的人应该经常遇到!

    2012年11月21日 3:52