sql server 当前内存占用、阻塞查询,以及索引优化

查看当前数据库是否存在阻塞

SELECT TOP 10 
    [session_id],[request_id],[start_time] AS '开始时间',[status] AS '状态',
    [command] AS '命令',dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名',
    [blocking_session_id] AS '正在阻塞其他会话的会话ID',[wait_type] AS '等待资源类型',
    [wait_time] AS '等待时间',[wait_resource] AS '等待的资源',[reads] AS '物理读次数',
    [writes] AS '写次数',[logical_reads] AS '逻辑读次数',[row_count] AS '返回结果行数'
FROM    
    sys.[dm_exec_requests] AS der 
CROSS APPLY     
    sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 
WHERE     
    [session_id]>50 AND DB_NAME(der.[database_id])='datebasename' 
ORDER BY     
    [cpu_time] DESC

查看sql占用较大的语句

SELECT TOP 10
    dest.[text] AS 'sql语句',session_id,status,start_time
FROM 
    sys.[dm_exec_requests] AS der 
CROSS APPLY 
    sys.[dm_exec_sql_text](der.[sql_handle]) AS dest 
WHERE     
    [session_id]>50   
ORDER BY
    [cpu_time] DESC

一个小时内sql语句资源占用情况

-- 获取最近一个小时内执行的 SQL 语句的资源使用情况
DECLARE @start_time DATETIME = DATEADD(HOUR, -1, GETDATE());

SELECT
    r.session_id,
    s.text AS query_text,
    r.total_elapsed_time,
--total_elapsed_time 请求所花费的总时间,以毫秒为单位
    r.logical_reads,
    r.reads,
    r.writes
FROM
    sys.dm_exec_requests r
CROSS APPLY
    sys.dm_exec_sql_text(sql_handle) AS s
WHERE
    r.start_time >= @start_time
ORDER BY
    r.total_elapsed_time DESC;

查询cpu占用最高的语句

 SELECT TOP 10
    total_worker_time/execution_count AS avg_cpu_cost, plan_handle,execution_count,
     (SELECT SUBSTRING(text, statement_start_offset/2 + 1,
        (CASE WHEN statement_end_offset = -1
           THEN LEN(CONVERT(nvarchar(max), text)) * 2
           ELSE statement_end_offset
        END - statement_start_offset)/2)
       FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
 FROM 
    sys.dm_exec_query_stats
 ORDER BY 
    [avg_cpu_cost] DESC

查询当前死锁

select a.text seesion_text,a.wait_type,a.wait_time,a.session_id,a.blocking_session_id,b.text blocking_session_text from  
 (select text,wait_resource,wait_type,wait_time,session_id,blocking_session_id from sys.dm_exec_requests  
 cross apply sys.dm_exec_sql_text(sql_handle) where wait_time>1000) a left join 
 (select c.session_id,t.text from sys.dm_exec_connections as c cross apply sys.dm_exec_sql_text(most_recent_sql_handle) as t) b  
 on b.session_id=a.blocking_session_id;

索引缺失查询,可考虑对查询结果添加索引

  SELECT 
      DatabaseName = DB_NAME(database_id)
      ,[Number Indexes Missing] = count(*) 
  FROM sys.dm_db_missing_index_details
  GROUP BY DB_NAME(database_id)
  ORDER BY 2 DESC;
  SELECT  TOP 10 
          [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 
          , avg_user_impact
         , TableName = statement
         , [EqualityUsage] = equality_columns 
         , [InequalityUsage] = inequality_columns
         , [Include Cloumns] = included_columns
 FROM        sys.dm_db_missing_index_groups g 
 INNER JOIN    sys.dm_db_missing_index_group_stats s 
        ON s.group_handle = g.index_group_handle 
 INNER JOIN    sys.dm_db_missing_index_details d 
        ON d.index_handle = g.index_handle
 ORDER BY [Total Cost] DESC;

查询缓存使用次数少,且cpu占用高的语句


SELECT TOP 100 
    usecounts, objtype, p.size_in_bytes,[sql].[text] 
FROM sys.dm_exec_cached_plans p 
OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql 
ORDER BY usecounts,p.size_in_bytes  desc

内存状态查询

SELECT type,
    sum(virtual_memory_reserved_kb)/ 1024  as '保留内存',
    sum(virtual_memory_committed_kb)/ 1024  as '提交的内存', 
    sum(awe_allocated_kb)/ 1024  as '开启AWE后使用的内存', 
    sum(shared_memory_reserved_kb)/ 1024  as '共享的保留内存' ,
    sum(shared_memory_committed_kb)/ 1024  as '共享的提交内存' 
FROM sys.dm_os_memory_clerks 
GROUP BY type
ORDER BY type

SELECT  total_physical_memory_kb / 1024 AS [物理内存(MB)] ,  
        available_physical_memory_kb / 1024 AS [可用物理内存(MB)] ,  
        system_cache_kb / 1024 AS [系统缓存内存总量(MB)] ,  
        ( kernel_paged_pool_kb + kernel_nonpaged_pool_kb ) / 1024 AS [内核池内存总量(MB)] ,  
        total_page_file_kb / 1024 AS [操作系统报告的提交限制的大小(MB)] ,  
        available_page_file_kb / 1024 AS [未使用的页文件的总量(MB)] ,  
        system_memory_state_desc AS [内存状态说明]  
FROM    sys.dm_os_sys_memory  

查询各数据库内存占用情况

SELECT count(*)*8/1024  as cached_pages_mb,CASE database_id
        WHEN 32767 THEN 'ResourceDb'
        ELSE db_name(database_id)
        END AS Database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY db_name(database_id) ,database_id
ORDER BY cached_pages_mb DESC

查看表或者索引占用的缓存空间状态

SELECT count(*)*8/1024 AS cached_pages_mb,obj.name ,obj.index_id,b.type_desc,b.name
FROM sys.dm_os_buffer_descriptors AS bd
    INNER JOIN
    (
        SELECT object_name(object_id) AS name
            ,index_id ,allocation_unit_id,object_id
        FROM sys.allocation_units AS au
            INNER JOIN sys.partitions AS p
                ON au.container_id = p.hobt_id
                    AND (au.type = 1 OR au.type = 3)
        UNION ALL
        SELECT object_name(object_id) AS name  
            ,index_id, allocation_unit_id,object_id
        FROM sys.allocation_units AS au
            INNER JOIN sys.partitions AS p
                ON au.container_id = p.partition_id
                    AND au.type = 2
    ) AS obj
        ON bd.allocation_unit_id = obj.allocation_unit_id
        LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id =obj.index_id
WHERE database_id = db_id()
GROUP BY obj.name, obj.index_id ,b.name,b.type_desc
ORDER BY cached_pages_kb DESC;

查询sql 语句缓存中的内存占用情况

SELECT  usecounts ,
        refcounts ,
        size_in_bytes/1024 as size_in_mb ,
        cacheobjtype ,
        objtype ,
        TEXT
FROM    sys.dm_exec_cached_plans cp
        CROSS APPLY sys.dm_exec_sql_text(plan_handle)
ORDER BY size_in_mb DESC ;

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]的描述,SqlServer占用内存情况可能与最大服务器内存的设置有关。根据作者的测试和理解,他们发现将最大服务器内存设小了反而使得SqlServer使用内存上限下降了。这表明最大服务器内存和最小服务器内存的设定并不是线性关系。根据引用\[3\]的描述,SqlServer对系统内存的管理原则是按需分配且贪婪,它不会自动释放内存,即使执行结果集大的sql语句后,数据已经取出,内存仍然会被占用直到占满机器内存。在重启服务之前,SqlServer不会释放该内存。因此,可能导致SqlServer占用内存的原因是内存机制和内存溢出。为了解决这个问题,可以尝试配置内存,根据实际情况调整最大服务器内存的设置。 #### 引用[.reference_title] - *1* *2* [SQLSERVER数据库内存占用高的解决方法](https://blog.csdn.net/dirful/article/details/121077629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Sqlserver进程内存占用很小,但是内存占用很大(限制最大内存)](https://blog.csdn.net/qq_34915141/article/details/128466006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值