In-Memory:内存优化表 DMV
SQL Server 在执行查询时,自动将活动的相关信息保存在内存中,这些活动信息称作DMV(Dynamic Management View),DMV记录SQL Server实例级别上的活动信息。由于DMV使用内存作为存储媒介,在读取DMV时,不需要IO操作,读写数据速度极快,不会对Server产生压力,并且DMV直接存储在服务器的内存中,能够及时、精确地反映系统性能的最新状态。
一,使用DMV的注意事项
1,确定数据保存的时间
内存是易失性的存储媒介,一旦SQL Server实例重启,DMV存储的信息将全部重置。在使用DMV时,首先需要检查这些信息在内存中保存了多长时间,以确定DMV数据的可用性。如果SQL Server仅仅运行很短的一段时间,那么对DMV数据进行统计和分析是不合适的,这些数据不是SQL Server 实例真实工作负载的数据样本。SQL Server运行的时候越长,DMV中保存的信息就越多(当然,DMV非常小,不会对内存造成压力),利用DMV分析就越准确。
2,DMV使用的内存有限
DMV能够使用的内存容量有限,这使得DMV只能存储有限数量的数据。如果SQL Server运行了很长世间,SQL Server Engine会将DMV的一些老数据覆盖。
二,查看内存优化表的DMV
SQL Server创建一些DMV,用于追踪内存优化表的活动信息,在内存优化表的DMV中,有两个对象ID(Object ID):
- xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命周期中,该ID可变;
- object_id 是User Table的ID,唯一标识该User Table,在对象的整个生命周期中,该ID不变;
xtp_object_id 是内部的内存优化表的ID(Internal Memory-Optimized Table),每一个User Table都对应一个或多个Internal Table:
- 一个Interal Table用于存储核心数据(Core Data);
- 其他的Internal Table 用于存储临时数据,Columnstore Index ,Off-Row(Lob);
- 详细信息,请阅读DMV: sys.memory_optimized_tables_internal_attributes
1,查看内存优化表占用的物理内存
--memory usage
select tms.object_id
,object_schema_name(tms.object_id)+'.'+object_name(tms.object_id) as table_name
,(tms.memory_allocated_for_indexes_kb+tms.memory_allocated_for_table_kb)/1024 as total_allocated_mb
,tms.memory_allocated_for_table_kb/1024 as table_allocated_mb
,tms.memory_used_by_table_kb/1024 as table_used_mb
,(tms.memory_allocated_for_table_kb-tms.memory_used_by_table_kb)/1024 as table_unused_mb
,tms.memory_allocated_for_indexes_kb/1024 as index_allocated_mb
,tms.memory_used_by_indexes_kb/1024 as index_used_mb
,(tms.memory_allocated_for_indexes_kb-tms.memory_used_by_indexes_kb)/1024 as index_unused_mb
from sys.dm_db_xtp_table_memory_stats tms
where tms.object_id>0
2,查看内存消费者(Memory Consumer)
每一个MOT都有单独的Memory Heap,称作VarHeap,是一个Memory Consumer,SQL Server从VarHeap中为MOT的数据分配内存空间。varheap是可变大小的堆数据结构,能够收缩和增长。VarHeap是由固定数量的Allocation Unit组成的集合。Allocation Unit用于分配特定大小的Page,Page的大小是不固定的,最常见的Page Size是64KB。
VarHeap用于Table Row 和 Bw-Tree Index。每一个LOB列(使用max指定大小)都有自己独立的VarHeap。在创建MOT时,SQL Server决定哪些column存储在Table的VarHeap中,哪些column存储在自己独立的VarHeap中。
Hash Index 使用另外一个Memory Consumer,称作Hash。
select
object_schema_name(mc.object_id)+'.'+object_name(mc.object_id) as table_name
,a.xtp_object_id
,a.type_desc as xtp_object_type
,iif(a.minor_id=0,'User Table','Off-Row Column:'+col_name(a.object_id,a.minor_id)) as xtp_object
,mc.memory_consumer_id as consumer_id
,mc.memory_consumer_type_desc as consumer_type
,mc.memory_consumer_desc as consumer_desc
,i.name as index_name
,i.type_desc as index_type_desc
,mc.allocated_bytes/1024/1024 as allocated_mb
,mc.used_bytes/1024/1024 as used_mb
,mc.allocation_count
from sys.dm_db_xtp_memory_consumers mc
inner join sys.memory_optimized_tables_internal_attributes a
on mc.object_id=a.object_id
and mc.xtp_object_id=a.xtp_object_id
left join sys.indexes i
on mc.object_id=i.object_id
and mc.index_id=i.index_id
where mc.object_id=object_id('[influencer].[Influencers]')
引用:SQL Server In-Memory OLTP Internals for SQL Server 2016
The varheaps are used for both table rows and Bw-tree indexes. (Hash indexes are the only structure used with memory-optimized tables that uses a different memory consumer.) In addition, each LOB, column (specified with the MAX qualifier in the datatype definition) has its own varheap. As mentioned earlier, SQL Server 2016 also supports large columns similar to the row-overflow columns for disk-based tables. For memory-optimized tables, SQL Server will decide when the table is created which of your variable length columns will be stored in the table’s varheap and which will be stored as overflow data and have their own varheap. You can think of LOB and row-overflow columns as being stored in their own internal tables.
You can examine the metadata for each varheap (and the other memory consumers) in a DMV called sys.dm_db_xtp_memory_consumers. Each memory-optimized table has a row in this view for each varheap and for each hash index. (We will see one more type of memory consumer, called HkCS Allocator, in the section on columnstore indexes on memory-optimized tables.) If we join this DMV with the catalog view called sys.memory_optimized_tables_internal_attributes we can see which varheap belongs to a specific column. Each user table has a unique object_id and xtp_object_id value which is used by all the indexes. Each additional varheap, for the row_overflow and LOB columns will have its own xtp_object_id. Note that if an object is altered, its xtp_object_id will change, but its object_id will not.
3,Hash Index的链表长度
对于Hash Index,表示链长的字段有:avg_chain_length 和 max_chain_length ,链长应保持在2左右;链长过大,表明太多的数据行被映射到相同的Bucket中,这会显著影响DML操作的性能。
导致链长过大的原因是:
- 总的Bucket数量少,导致不同的Index Key映射到相同的Bucket上;
- 如果空的Bucket数量大,但链长过大,这说明,Hash Index存在大量重复的Index Key;相同的Index Key被映射到相同的bucket;
- 详细信息,请阅读:sys.dm_db_xtp_hash_index_stats (Transact-SQL);
4,事务
在访问MOT时,有两种类型事务ID,在事务中,访问MOT和访问DBT的事务是独立的:
- xtp_transaction_id:是访问MOT的事务ID;
- transaction_id:是访问DBT的事务ID,0表示事务没有访问MOT;
- 详细信息,请阅读:sys.dm_db_xtp_transactions (Transact-SQL)
查看当前数据库中活跃事务的信息:
select t.xtp_transaction_id
,t.transaction_id
,t.session_id
,t.begin_tsn
,t.end_tsn
,t.state_desc
,t.result_desc
from sys.dm_db_xtp_transactions t
参考文档:
Baselining with SQL Server Dynamic Management Views
Memory-Optimized Table Dynamic Management Views (Transact-SQL)
In-Memory:内存优化表 DMV的更多相关文章
- In-Memory:内存优化表的DMV
SQL Server 在执行查询时,自动将活动的相关信息保存在内存中,这些活动信息称作DMV(Dynamic Management View),DMV记录SQL Server实例级别上的活动信息.由于 ...
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
- 试试SQLSERVER2014的内存优化表
试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...
- SQLSERVER2014的内存优化表
SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载. 就算如此, ...
- Sql server2014 内存优化表 本地编译存储过程
参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...
- 试试SQLServer 2014的内存优化表
SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...
- 试试SQLServer 2014的内存优化表(转载)
SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...
- 使用SQL Server内存优化表 In-Memory OLTP
如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能.你甚至可以把它当作Redis来使用. 要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组. M ...
- SQLServer2014内存优化表评测
SQLServer2014内存优化表评测 分类: SQL内存表2014-06-20 11:49 1619人阅读 评论(11) 收藏 举报 目录(?)[-] SQLServer2014的使用基本要求 内 ...
随机推荐
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- WPF 微信 MVVM 【续】发送部分QQ表情
今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTex ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分
Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...
- canvas快速绘制圆形、三角形、矩形、多边形
想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...
- BPM配置故事之案例4-子表
公司渐渐对采购管理重视起来了,新招聘了采购主管老李,老李对现有的申请表很不满意,要求将申请物资和申请原因改成物资明细表 物资明细表 小明只好继续致电大毛-- 大毛:把申请物资和申请原因删掉,新增一个数 ...
- IT雇员及外包商选择:人品第一
最近,苹果iOS操作系统和智能手机爆出了一个奇葩故障,在播放特定一段五秒钟的视频时能导致手机死机.唯一的解决办法是按住电源键和Home按键进行手机的重启. 第十八届中国国际高新技术成果交易会在深圳举办 ...