第3/24周 区_SQL Server中管理空间的基本单位
哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Server内核运行机制有了很好的认识。今天我会讲下SQL Server中的区管理,因为这是个很重要的话题,我们会在第23周探讨TempDb。在最高级别来讲,区就是一组8张8k大小的页。因此一个区始终是64k的块(连续页)。SQL Server内部施行2类区:
- 混合区
- 统一区
混合区和统一区
在混合区的8个页可以属于像表和索引的不同数据库对象。这也是说混合区可以指向不同的数据库对象。在另外一方面,在统一区里所有的8个页面是属于同个数据库对象。现在的问题是,为什么SQL Server做出这样的区别?这个基本上是个与历史有关的问题。我们来解释下。
在上一世纪存储是非常,非常贵的。那是的目标就是尽可能有效的使用存储。因为新表和索引的第1个8页总是分配在混合区。这也意味着你的表或索引刚开始创建时总在8k的块(混合区)里。这样的话小表保持很小的存储占用。你正在尽可能有效的使用存储。当你的数据库对象需要分配第9个页时,SQL Server会分配整个统一区给那个数据库对象。它的大小从8kb 变成了72kb,到第17个页它的增长从72kb 变成了136kb,然后按此规律继续增长。现在你会对那个事实表示摇头,但在上个世纪,这曾是非常重要的设计选择。下面的图片会展示了一个区看起来是什么样(在一个非常简化的方式下)。
区管理
现在的问题是SQL Server如何管理这些区?想象下你有一个1TB大小的数据库,这会给你巨大数量的区。SQL Server这里使用2个特殊的页来管理,同样它们也是8kb 的大小。
- 全局分配映射表(GAM: Global Allocation Map Pages)
- 共享全局分配映射表(SGAM: Shared Global Allocation Map Pages)
统一区始终由GAM页管理。SQL Server使用8000 bytes 的GAM页,它给你64000位。(8000 * 8)。在那个巨大的掩码位图里,每个位代表一个统一区。如果那个位标记为1,表示那个统一区是空的,如果标记为0,表示那个统一区已被使用。这也意味着你4G区间的数据里只能有一个GAM页来管理(64000 * 64 / 1024 /1024)。因此每隔4G的数据文件都会有一个GAM页。这些对SGAM页也是对的。一个SGAM页也只能管理4GB的数据,因为你只有64000位可用。
当你在表里插入一条新记录,SQL Server会通过SGAM页找至少有一页空闲的混合区来插入数据。如果你的表/索引大于64kb,SQL Server会通过GAM页直接找空闲的统一区来插入数据。很简单,是不是?
在第23周,当我们探讨TempDb时,在我们同时在TempDb里尝试创建巨大数量的临时数据时,这个会引起严重的性能问题。到时我们会提到通过修改TempDb数据的一些设置来克服这个问题。
小结
在这周的性能调优培训里我们探讨了SQL Server中的区和区管理。到现在应该已经有很好并结实的SQL Server内部构造理解。
如果你想学习更多的区管理知识,我推荐下列文章:
- SQL Server :理解GAM和SGAM页
- SQL Server :理解IAM Pages
- SQL Server :理解Page Free Space (PFS) 页
- SQL Server :理解DCM页
- SQL Server :理解BCM页
- SQL Server :理解数据文件结构
在接下来的培训中,这些知识会作为性能调优和故障排除的先决条件。希望今天的培训你有所享受,下星期我回来的时候,我们会学习数据页的一些限制,还有我们如何和它们作战。请继续关注!
围观PPT:
0504_03区_SQL_Server中管理空间的基本单位.rar
第3/24周 区_SQL Server中管理空间的基本单位相关推荐
- 第3周 区_SQL Server中管理空间的基本单位
第3周 区_SQL Server中管理空间的基本单位 原文:第3周 区_SQL Server中管理空间的基本单位 哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Serve ...
- sql server分页_SQL Server中的分页
sql server分页 Pagination is a process that is used to divide a large data into smaller discrete pages ...
- 哈希分区和顺序分区_SQL Server中的哈希分区
哈希分区和顺序分区 In SQL Server, when talking about table partitions, basically, SQL Server doesn't directly ...
- sql server锁异常_SQL Server中异常处理的背景
sql server锁异常 RAISERROR statement. RAISERROR语句. Figure 1 demonstrates a combination of mandatory par ...
- sql server 转发_SQL Server中的转发记录性能问题
sql server 转发 This article discusses the Forwarded Records and its performance issues for heap table ...
- 可以储存照片的字段类型是_sql server 中 哪个字段类型可以储存图象?
展开全部 可以将图片上传到指定目录并将路径记录在数据库中,要用的时候再从数据库中取路径根据路径找到图片.e68a84e8a2ad62616964757a686964616f31333234303663 ...
- cte公用表表达式_SQL Server中的CTE; 使用公用表表达式解决重新编制标识符列的问题
cte公用表表达式 Since we know that the SQL CTE (common table expression) offers us a tool to group and ord ...
- java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置
java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...
- sql server序列_SQL Server中的序列对象
sql server序列 Sequence objects are used to sequentially generate numeric values. They were introduced ...
- sql 触发器嵌套条件_SQL Server中的嵌套触发器
sql 触发器嵌套条件 Nested Triggers in SQL Server are actions that automatically execute when a certain data ...
最新文章
- FreeModbus 移植于STM32 实现Modbus RTU通信
- python操作json_Python学习之利用Python处理JSON格式数据
- 最短路上的统计(Floyd)
- 05_学生管理系统,xml读写,布局的综合应用
- TNN MatConvertParam参数scale和bias设置
- mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...
- Android:ListView
- 判断一个整数的奇偶性php,【算法】- 判断一个整数是否是奇数
- final修饰的类有什么特点?
- atitit.基于http json api 接口设计 最佳实践 总结o7
- 声明与所在行数不兼容_深度理解:Windows DLL 二进制兼容性探究
- 什么是缺陷分析?一篇文章带你了解,测试工程师必备技能
- 科立捷默认频率_科立捷对讲机频率
- MQL5 信号的优势
- C++洛谷题解(17)——P5713
- this在什么时候为undefined
- 今年双旦期间简直人品爆棚,晒晒我抽中的趣享付趣号卡
- 看到结局不会失望的,中国传统美食
- 用 Appium 自动收取蚂蚁森林能量
- 使用深度学习进行三维脑肿瘤分割
热门文章
- 获得iframe中的对象的方法
- Beta冲刺-第二天
- Linux例行性工作排程 (crontab)
- 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢
- 搭建 SQL Server 复制 (一)
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- 使用kitti2bag和RVIZ播放KITTI数据集
- 【安装部署】Linus安装Mysql
- alias自定义别名
- 20165329 Java实验四 Android程序设计