IAM页面是在统一区分配的还是在混合区分配的?

IAM页面的作用这里就不说了,网上的资料很多

文章中用到的工具:查看SQLSERVER内部数据页面的小插件Internals Viewer

先建立四张表,堆表、聚集索引表、非聚集索引表、聚集索引和非聚集索引表

 USE master
GO
--新建数据库IAMDB
CREATE DATABASE IAMDB
GO USE IAMDB
GO --DROP TABLE heaptable
--DROP TABLE clusteredtable
--DROP TABLE nonclusteredtable
--DROP TABLE clusteredandnonclusteredtable --建立测试表
CREATE TABLE heaptable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
GO
CREATE TABLE clusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
GO
CREATE TABLE nonclusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
GO
CREATE TABLE clusteredandnonclusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
GO --建立索引
CREATE CLUSTERED INDEX cix_clusteredtable ON clusteredtable([C1])
GO
CREATE INDEX ix_nonclusteredtable ON nonclusteredtable([C1])
GO
CREATE CLUSTERED INDEX cix_clusteredandnonclusteredtable ON clusteredandnonclusteredtable([C1])
GO
CREATE INDEX ix_clusteredandnonclusteredtable ON clusteredandnonclusteredtable([C1])
GO --插入测试数据
DECLARE @a INT;
SELECT @a = 1;
WHILE (@a <= 3)
BEGIN
INSERT INTO heaptable VALUES ( replicate('a', 5000))
SELECT @a = @a + 1
END DECLARE @a INT;
SELECT @a = 1;
WHILE (@a <= 3)
BEGIN
INSERT INTO clusteredtable VALUES ( replicate('a', 5000))
SELECT @a = @a + 1
END DECLARE @a INT;
SELECT @a = 1;
WHILE (@a <= 3)
BEGIN
INSERT INTO nonclusteredtable VALUES ( replicate('a', 5000))
SELECT @a = @a + 1
END DECLARE @a INT;
SELECT @a = 1;
WHILE (@a <= 3)
BEGIN
INSERT INTO clusteredandnonclusteredtable VALUES ( replicate('a', 5000))
SELECT @a = @a + 1
END --查询数据
SELECT * FROM heaptable ORDER BY [c1] ASC
SELECT * FROM clusteredtable ORDER BY [c1] ASC
SELECT * FROM nonclusteredtable ORDER BY [c1] ASC
SELECT * FROM clusteredandnonclusteredtable ORDER BY [c1] ASC

这些表的特点是一行记录刚好占用一页

创建DBCCResult表

 USE [IAMDB]
GO
CREATE TABLE DBCCResult (
PageFID NVARCHAR(200),
PagePID NVARCHAR(200),
IAMFID NVARCHAR(200),
IAMPID NVARCHAR(200),
ObjectID NVARCHAR(200),
IndexID NVARCHAR(200),
PartitionNumber NVARCHAR(200),
PartitionID NVARCHAR(200),
iam_chain_type NVARCHAR(200),
PageType NVARCHAR(200),
IndexLevel NVARCHAR(200),
NextPageFID NVARCHAR(200),
NextPagePID NVARCHAR(200),
PrevPageFID NVARCHAR(200),
PrevPagePID NVARCHAR(200)
)

我们看一下heaptable表的IAM页面是哪一个

 --TRUNCATE TABLE [dbo].[DBCCResult]

 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,heaptable,-1) ')

 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 

IAM页面号为80

看一下clusteredtable表的IAM页面是哪一个

 --TRUNCATE TABLE [dbo].[DBCCResult]

 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,clusteredtable,-1) ')

 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 

IAM页面号为120

看一下nonclusteredtable表的IAM页面是哪一个

 --TRUNCATE TABLE [dbo].[DBCCResult]

 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,nonclusteredtable,-1) ')

 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 

IAM页面号为121和110

看一下clusteredandnonclusteredtable表的IAM页面是哪一个

 --TRUNCATE TABLE [dbo].[DBCCResult]

 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,clusteredandnonclusteredtable,-1) ')

 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 

IAM页面号为126和93


IAM页面号分别为:80、120、121、110、126、93

我们打开SSMS的插件Internals Viewer

点击PFS按钮

可以看到所有IAM页面都在混合区

实际上,如果你用Internals Viewer查看其他数据库的任何一个IAM页都是分配在混合区的

我们在网上也看到

地址:http://msdn.microsoft.com/zh-cn/library/ms174412(v=sql.100).aspx

地址:http://www.cnblogs.com/wcyao/archive/2011/06/28/2092270.html

为什麽始终从混合区进行分配呢??
 
统一区:由单个对象所有。区中的所有8页只能由一个对象使用
 
混合区:最多可由8个对象共享。区中8页的每页可由不同对象所有。但是一页总是只能属于一个对象
 
因为在大部分情况下一个对象(一张表一般只有很少的IAM页),这样的情况下,如果用统一区就显得浪费了

为什麽说大部分情况下呢?如果表中有分区、LOB数据页、行溢出数据页,这时候IAM页就会有很多,尽管这样,

IAM页面还是从混合区分配

详细看这篇文章,IAM页的数量与什么有关

http://www.cnblogs.com/wcyao/archive/2011/06/28/2092270.html


还有使用DMV:dm_db_index_physical_stats来查看表中的页面数量的时候,IAM页是不统计入结果中的

heaptable表

 SELECT
[database_id],
[index_id],
[index_type_desc],
[index_level],
[fragment_count],
[page_count],
[avg_fragmentation_in_percent],
[record_count]
from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('heaptable'),null,null,'detailed')

clusteredtable表

 SELECT
[database_id],
[index_id],
[index_type_desc],
[index_level],
[fragment_count],
[page_count],
[avg_fragmentation_in_percent],
[record_count]
from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('clusteredtable'),null,null,'detailed')

nonclusteredtable表

 SELECT
[database_id],
[index_id],
[index_type_desc],
[index_level],
[fragment_count],
[page_count],
[avg_fragmentation_in_percent],
[record_count]
from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('nonclusteredtable'),null,null,'detailed')

clusteredandnonclusteredtable表

 SELECT
[database_id],
[index_id],
[index_type_desc],
[index_level],
[fragment_count],
[page_count],
[avg_fragmentation_in_percent],
[record_count]
from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('clusteredandnonclusteredtable'),null,null,'detailed')


如有不对的地方,欢迎大家拍砖o(∩_∩)o

IAM页面是在统一区分配的还是在混合区分配的?的更多相关文章

  1. 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分配方式  | 百篇博客分析OpenHarmony源码 | v11.02

    百篇博客系列篇.本篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分配方式 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些 ...

  2. ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区

    前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...

  3. 【软件工程-Teamwork 3】团队角色分配和团队贡献分分配规则

    Part 1 团队角色分配 1.人员分配概要: Project Manager:1名 / Developer:4名 / Test: 1名 2.具体人员分配及职责: Project Manager(PM ...

  4. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  5. Oracal 学习之用户角色创建分配表空间 给角色分配权限

    //创建角色inspur 密码为inspur,默认的表空间为USERS create user inspur identified by inspur default tablespace USERS ...

  6. 【小实验】rust的数组是在堆上分配还是在栈上分配的呢?

    先看代码: fn main(){ let v = [1,2,3,4,5]; let addr = &v[0] as *const i32 as usize; println!("ar ...

  7. 绘制FastMM内存分配流程图(小块内存分配)

    http://blog.csdn.net/henreash/article/details/38751353

  8. SQLSERVER新建表的时候页面分配情况是怎样的?

    SQLSERVER新建表的时候页面分配情况是怎样的? 再次感谢sqlskill网站和转载sqlskill网站文章并翻译的人,因为您们的转载和翻译让小弟又学习到新的东西o(∩_∩)o 文章中用到的工具: ...

  9. SQL Server 存储(5/8):理解IAM 页

    在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...

随机推荐

  1. JVM(二)JVM的结构

    1.JVM的结构包括 (1)类加载器 (2)执行引擎 (3)运行时数据区 (4)本地库接口 类加载器:包括启动类加载器.扩展类加载器.应用程序类加载器.自定义加载器. 执行引擎:在执行JAVA代码的时 ...

  2. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  3. 第十五章-class类文件结构

    参考博文: (1)关于class的签名Signature (2)关于访问标识 (3)关于Class中的Signature属性 (4)附录1 常量池解析 (5)附录2 方法解析 (6)Class文件结构 ...

  4. tomcat 启动速度慢背后的真相

    1. tomcat 启动慢 在线上环境中,我们经常会遇到类似的问题,就是tomcat 启动比较慢,查看内存和cpu,io都是正常的,但是启动很慢,有的时候长达几分钟,这到底是什么原因导致的. 1.1 ...

  5. MVC返回文件

    上一篇 介绍了Action 返回View, 顺便也看到了返回Json的处理, 这一篇并不看文件返回的源码, 此篇是为了应用. 1. Response返回文件 在MVC的项目中, 还是能看到很多同事, ...

  6. php还原16进制特殊字符

    特殊字符的16进制表:https://websitebuilders.com/tools/html-codes/ascii/ 可以通过 hexdec() 和 chr()方法来进行转换, 例子: < ...

  7. Yarn和Mesos:资源管理调度平台

    目前得分布式系统中,对于资源管理都采用动态资源划分来取代静态资源划分.它有如下好处: 集群资源利用率高 增加数据共享能力,可以多种计算框架公用一份分布式存储数据. 资源管理抽象模型 概念模型 常见得资 ...

  8. Qt5——从零开始的Hello World教程(Qt Creator)

    简单Qt教程 一.打开Qt Creator 本次的目的是用Qt Creator建立一个Hello World项目,在安装Qt之后,首先要打开Qt Creator. 就是它啦,打开后会显示如下页面. 二 ...

  9. elasticsearch安装ansj分词器

    1.概述    elasticsearch用于搜索引擎,需要设置一些分词器来优化索引.常用的有ik_max_word: 会将文本做最细粒度的拆分.ik_smart: 会做最粗粒度的拆分.ansj等. ...

  10. 数字三角形 (简单DP)

    问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国.美国人民的生活非常有意思,经常会有形形色色.奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞 ...