windows memory:  Memory: Cache Bytes 是系统的working set, 也就是系统使用的物理内存数目。 可以观察Windows用了多少物理内存。

  1. System Cache Resident Bytes

  2. System Driver Resident Bytes

  3. System Code Resident Bytes

  4. Pool Paged Resident Bytes

SQL Server 动态管理内存:

SQL Server 是通过以下的API去感知windows是否有内存压力:

APIQueryMemoryResourceNotification -》 windows memory -》 decrease target server memory.

Total server memory : SQL Server启动账户拥有 Lock pages in memory 权限, 锁定内存,避免windows抢夺内存

Target server memory:  SQL在启动时候, 比较AWE, max server memory, physical memory 三者选一个最小的值作为Target server memory.

comparison

Result

Remark

Total <   target

Windows   has enough memory, SQL can allocate new memory for new data

Total is   increasing

Total =   target

SQL   used all of memory, SQL don’t allocate new memory for new data

SQL   clean up memory for new data, such as Lazy writer

Total >   target

Windows   has memory pressure, SQL decrease Target

SQL   clean up memory for new data, such as Lazy writer to release buffer pool and   cached plan

SQL server 内存管理概念: DBCC memorystatus -- 查看内存使用情况

1. Reserved memory:

2. Committed memory: = Physical memory + Page file = Shared memory + Private Bytes

3. Shared memory:

4. Private Bytes:

5. Working Set: = shared memory + Private Bytes - Page file

6. Page Fault(soft/hard)

32位SQL:

memToLeave: 256MB+256thread*521KB=384MB (SQL 启动的时候就计算好了,不能变大): extended stored procedure, third party dirver, and linked server : 启动参数 -g512 = 512MB+256thread*521KB

BufferPool = 2G-384MB=1664MB (包括 database cache + stolen memory)

AWE开启以后, 只能给先reserve再commit的部分使用,即只能给database cache来扩展使用(Physical memory-2GB就是AWE扩展后database cache所能用的内存数量),stolen memory只能用1664MB里的内存。

SQL内存使用情况分析:

1. SQL性能计数器:

  memory manager:

    Total server memory,

    target server memory,

    Optimizer memory

    SQL cache memory

    Lock memory

    Connection memory

    Granted workspace memory:  hash, sort, bulk-insert, create index...

    Memory grants pending: 等待工作空间内存授权的进程总数, 不等于0, 意味着比较严重的内存瓶颈

  Buffer manager:

    Buffer Cache Hit Ratio: 应该>99%, 如果<95%, 通常就是内存不足的问题

    Checkpoint pages/sec: 这个和内存压力没有关系,和用户的行为有关。用户做很多insert/update/delete, 这个值就会很大,脏数据多。

    database pages: 就是 database cache

    free pages:

    Lazy writes/sec: 如果SQL 内存压力不大,不会经常触发lazy writer。 如果经常触发, 那么就应该是有内存的瓶颈

    page life expectancy: 页不被引用,将在缓冲池中停留的秒数。只有Lazy writer 被触发, Page life expectancy 才会突然下降。如果总是高高低低的, 应该是有内存压力

    page reads/sec: 这个值正常情况下应该很低。 如果比较高, 一般page life expectancy 会下降, Lazy writes/sec 会上升。

    stolen pages: 所有非database pages, 包括执行计划缓存。

内存DMV:sys.dm_os_memory_clerk

  select type,

    sum(virtual_memory_reserved_kb) as [vm reserved],

    sum(virtual_memory_committed_kb) as [vm committed],

    sum(awe_allocated_kb) as [AWE allocated],

    sum(shared_memory_reserved_kb) as [SM reserved],

    sum(shared_memory_committed_kb) as [SM committed],

    sum(multi_pages_kb) as [Multipage allocator],

    sum(single_pages_kb) as [Singlepage allocator]

  from sys.dm_os_memory_clerks

  group by type

  order by type

内存中的数据页面由哪些表格组成,各占多少: sys.dm_os_buffer_descriptors

  dbcc dropcleanbuffers  --clean up data buffer

  go

  

  

declare @name varchar(100)

declare @cmd varchar(5000)

declare c1 cursor for select name from sys.sysdatabases

open c1

fetch next from c1 into @name

while @@FETCH_STATUS=0

begin

print @name

set @cmd= 'select b.database_id, db=db_name(b.database_id), object_name(p.object_id), p.index_id, buffer_count_kb=count(*)*8 from '  +@name+'.sys.allocation_units a, '+@name+'.sys.dm_os_buffer_descriptors b,'+@name  +'.sys.partitions p where a.allocation_unit_id=b.allocation_unit_id and a.container_id=p.hobt_id '  +' and b.database_id=db_id('''+@name+''')'  +' group by b.database_id, p.object_id, p.index_id '  +' order by b.database_id, buffer_count_kb desc '

print @cmd

exec(@cmd)

fetch next from c1 into @name

end

close c1

deallocate c1

go

执行计划都缓存了些什么? 哪些比较占内存?

  select objtype, sum(size_in_bytes) as sum_size_in_bytes, count(bucketid) as cache_counts

  from sys.dm_exec_cached_plans

  group by objtype

  select usecounts,refcounts, size_in_bytes, cacheobjtype, objtype, text

  from sys.dm_exec_cached_plans cp

  cross apply sys.dm_exec_sql_text(plan_handle)

  order by objtype desc;

  go

-----------------华丽的分割线: 下面开始分析 数据页面(database page),  buffer pool 里的stolen, multi-page 这三部分------------------------------------

数据缓冲区压力分析:

  Lazy writes/sec 高

  Page life expectancy 低

  Page reads/sec 高: 正常这个值应该接近0, 指从数据文件读取的数据量

  Stolen pages 降低

  sys.sysprocesses 中出现一些连接等待I/O完成的现象: PAGEIOLATCH_SH

  使用DMV分析启动以来做read最多的语句:

  --按照物理读的页面数排序,前50名:

  select top 50

  qs.total_physical_reads, qs.execution_count,

  qs.total_physical_reads / qs.execution_count as [avg IO],

  substring(qt.text, qs.statement_start_offset/2,

    (case when qs.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2

      else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text,

  qt.dbid, dbname=db_name(qt.dbid),

  qt.objectid, qs.sql_handle, qs.plan_handle

  from sys.dm_exec_query_stats qs

  cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt

  order by qs.total_physical_reads desc

  --按照逻辑读的页面数排序,前50名

  select top 50

  qs.total_logical_reads, qs.execution_count,

  qs.total_logical_reads / qs.execution_count as [avg IO],

  substring(qt.text, qs.statement_start_offset/2,

    (case when qs.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2

      else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text,

  qt.dbid, dbname=db_name(qt.dbid),

  qt.objectid, qs.sql_handle, qs.plan_handle

  from sys.dm_exec_query_stats qs

  cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt

  order by qs.total_logical_reads desc

  --使用trace 文件分析做read最多的语句

  select * into sample

  from fn_trace_gettable('c:\sample.trc',default)

  where eventclass in (10, 12)  -- 10: RPC completed    12: SQL batch completed

  select top 1000 textdata, databaseid, hostname, applicationname, loginname, spid

    starttime, endtime,duration,reads,writes,cpu

  from sample

  order by reads desc

  --使用ReadTrace工具分析trace文件,找出使用大量系统资源的语句

  使用方法见稍后发出。。。

Stolen Memory缓存压力分析:

  Stolen memory 凡是以8K为分配单位的,保存在buffer pool里。 大于8K的,保存在MemToLeave里。

  缓存: 执行计划,用户安全上下文,连接的数据结构和输入/输出缓冲区

  没有缓存: 语义分析,优化,排序,Hash,计算

  Stolen memory 在不同的SQL版本,最大的限制是不同的,见下表:

  

  表征与解决方法:查看 sys.sysprocesses 里面的连接等待waittype字段不等于0x0000: (可以手动 DBCC FREEPROCCACHE)

  1. CMEMTHREAD (0x00B9)

  2. SOS_RESERVEDMEMBLOCKLIST (0x007B)

  3. RESOURCE_SEMAPHORE_QUERY_COMPILE(0x011A)

SQL Server 内存管理的更多相关文章

  1. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  2. SQL Server 内存管理在64位时代的改变

    64位机上  地址空间比以前大了去了.它引起的改变多了去了 1.MemToLeave这个词不存在了.因为SQL Server以不再做这种预留空间的事了,也就是说multiple page 想用多少就用 ...

  3. Sql Server 内存相关计数器以及内存压力诊断

    在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中 ...

  4. sql server 内存初探

    一. 前言 对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在sql统计或大量查询数据输出时,会有这 ...

  5. (1)SQL Server内存浅探

    1.前言 对于数据库引擎来说,内存是一个性能提升的重要解决手段.把数据缓存起来,可以避免在查询或更新数据时花费多余的时间,而这时间通常是从磁盘获取数据时用来等待磁盘寻址的.把执行计划缓存起来,可以避免 ...

  6. SQL SERVER 内存学习系列(二)-DMV查看内存信息

    内存管理在SQL Server中有一个三级结构.底部是内存节点,这是最低级的分配器,用于SQL Server的内存.第二个层次是由内存Clerk组成,这是用来访问内存节点和缓存存储,缓存存储则用于缓存 ...

  7. SQL Server内存理解的误区

    SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...

  8. SQL SERVER 内存分配及常见内存问题 DMV查询

    内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT  [type] , SUM(virtual_memory_reserved_kb) AS [VM R ...

  9. SQL SERVER 内存分配及常见内存问题 简介

    一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQ ...

随机推荐

  1. windows和linux间互传文件

    方法1:Xshell传输文件 用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安 ...

  2. alibaba笔试2

    11. 12.C 13.C 14.C 关联:http://www.codingnow.com/2000/download/lua_manual.html 15.A

  3. codeforces 671C Ultimate Weirdness of an Array 线段树+构造

    题解上说的很清楚了,我照着写的,表示膜拜题解 然后时间复杂度我觉得应该是O(nlogn),虽然常数略大,预处理和倒着扫,都是O(nlogn) #include <stdio.h> #inc ...

  4. selenium运行chrome去掉command -line flag

    每次驱动chrome浏览器都会出现这玩意,比较烦人··想办法去掉了它: ChromeOptions options = new ChromeOptions();options.addArguments ...

  5. 用JDK自带的工具生成客户端调用Webservice的代码

    JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使 ...

  6. uva 12304

    题意:要求解答6个关于圆的问题. 1.给出三角形坐标求外接圆 2.给出三角形坐标求内切圆 3.给出一个圆心和半径已知的圆,求过点(x,y)的所有和这个圆相切的直线 4.求所有和已知直线相切的过定点(x ...

  7. C#编程中的66个好习惯,你有多少个?(转)

    http://www.cnblogs.com/jxsoft/archive/2012/01/11/2318824.html

  8. MySQL 字段类型详解

    一.非数字类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字元 binary :分辨大小写 固定长度 std_name cahr(32) not null VarCh ...

  9. EXCEL 建立工作薄与工作表

    //1.引用单元 uses ComObj; //2.建立工作薄与工作表 procedure TForm1.Button1Click(Sender: TObject); Var ExcelApp,She ...

  10. 第十一章、认识与学习 BASH 数据流重导向

    数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据 ...