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


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

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

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

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

     1 USE master
     2 GO
     3 --新建数据库IAMDB
     4 CREATE DATABASE IAMDB
     5 GO
     6 
     7 USE IAMDB
     8 GO
     9 
    10 
    11 --DROP TABLE heaptable
    12 --DROP TABLE clusteredtable
    13 --DROP TABLE nonclusteredtable
    14 --DROP TABLE clusteredandnonclusteredtable
    15 
    16 --建立测试表
    17 CREATE TABLE heaptable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
    18 GO
    19 CREATE TABLE clusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
    20 GO
    21 CREATE TABLE nonclusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
    22 GO
    23 CREATE TABLE clusteredandnonclusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (5000))
    24 GO
    25 
    26 --建立索引
    27 CREATE CLUSTERED INDEX cix_clusteredtable ON clusteredtable([C1])
    28 GO
    29 CREATE  INDEX ix_nonclusteredtable ON nonclusteredtable([C1])
    30 GO
    31 CREATE CLUSTERED INDEX cix_clusteredandnonclusteredtable ON clusteredandnonclusteredtable([C1])
    32 GO
    33 CREATE  INDEX ix_clusteredandnonclusteredtable ON clusteredandnonclusteredtable([C1])
    34 GO
    35 
    36 --插入测试数据
    37 DECLARE @a INT;
    38 SELECT @a = 1;
    39 WHILE (@a <= 3)
    40 BEGIN
    41     INSERT INTO heaptable VALUES ( replicate('a', 5000))
    42     SELECT @a = @a + 1
    43 END
    44 
    45 
    46 
    47 DECLARE @a INT;
    48 SELECT @a = 1;
    49 WHILE (@a <= 3)
    50 BEGIN
    51     INSERT INTO clusteredtable VALUES ( replicate('a', 5000))
    52     SELECT @a = @a + 1
    53 END
    54 
    55 
    56 DECLARE @a INT;
    57 SELECT @a = 1;
    58 WHILE (@a <= 3)
    59 BEGIN
    60     INSERT INTO nonclusteredtable VALUES ( replicate('a', 5000))
    61     SELECT @a = @a + 1
    62 END
    63 
    64 
    65 DECLARE @a INT;
    66 SELECT @a = 1;
    67 WHILE (@a <= 3)
    68 BEGIN
    69     INSERT INTO clusteredandnonclusteredtable VALUES ( replicate('a', 5000))
    70     SELECT @a = @a + 1
    71 END
    72 
    73 --查询数据
    74 SELECT * FROM heaptable  ORDER BY [c1] ASC
    75 SELECT * FROM clusteredtable  ORDER BY [c1] ASC
    76 SELECT * FROM nonclusteredtable  ORDER BY [c1] ASC
    77 SELECT * FROM clusteredandnonclusteredtable  ORDER BY [c1] ASC
    View Code

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

    创建DBCCResult表

     1 USE [IAMDB]
     2 GO
     3 CREATE TABLE DBCCResult (
     4 PageFID NVARCHAR(200),
     5 PagePID NVARCHAR(200),
     6 IAMFID NVARCHAR(200),
     7 IAMPID NVARCHAR(200),
     8 ObjectID NVARCHAR(200),
     9 IndexID NVARCHAR(200),
    10 PartitionNumber NVARCHAR(200),
    11 PartitionID NVARCHAR(200),
    12 iam_chain_type NVARCHAR(200),
    13 PageType NVARCHAR(200),
    14 IndexLevel NVARCHAR(200),
    15 NextPageFID NVARCHAR(200),
    16 NextPagePID NVARCHAR(200),
    17 PrevPageFID NVARCHAR(200),
    18 PrevPagePID NVARCHAR(200)
    19 )
    View Code

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

    1 --TRUNCATE TABLE [dbo].[DBCCResult]
    2 
    3 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,heaptable,-1) ')
    4 
    5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
    View Code

    IAM页面号为80

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

    1 --TRUNCATE TABLE [dbo].[DBCCResult]
    2 
    3 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,clusteredtable,-1) ')
    4 
    5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
    View Code

    IAM页面号为120

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

    1 --TRUNCATE TABLE [dbo].[DBCCResult]
    2 
    3 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,nonclusteredtable,-1) ')
    4 
    5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
    View Code

    IAM页面号为121和110

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

    1 --TRUNCATE TABLE [dbo].[DBCCResult]
    2 
    3 INSERT INTO DBCCResult EXEC ('DBCC IND(IAMDB,clusteredandnonclusteredtable,-1) ')
    4 
    5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
    View Code

     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表

     1 SELECT 
     2 [database_id],
     3 [index_id],
     4 [index_type_desc],
     5 [index_level],
     6 [fragment_count],
     7 [page_count],
     8 [avg_fragmentation_in_percent],
     9 [record_count] 
    10 from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('heaptable'),null,null,'detailed')
    View Code

    clusteredtable表

     1 SELECT 
     2 [database_id],
     3 [index_id],
     4 [index_type_desc],
     5 [index_level],
     6 [fragment_count],
     7 [page_count],
     8 [avg_fragmentation_in_percent],
     9 [record_count] 
    10 from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('clusteredtable'),null,null,'detailed')
    View Code

    nonclusteredtable表

     1 SELECT 
     2 [database_id],
     3 [index_id],
     4 [index_type_desc],
     5 [index_level],
     6 [fragment_count],
     7 [page_count],
     8 [avg_fragmentation_in_percent],
     9 [record_count] 
    10 from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('nonclusteredtable'),null,null,'detailed')
    View Code

    clusteredandnonclusteredtable表

     1 SELECT 
     2 [database_id],
     3 [index_id],
     4 [index_type_desc],
     5 [index_level],
     6 [fragment_count],
     7 [page_count],
     8 [avg_fragmentation_in_percent],
     9 [record_count] 
    10 from sys.dm_db_index_physical_stats(DB_ID('IAMDB'),object_id('clusteredandnonclusteredtable'),null,null,'detailed')
    View Code

     


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

  • 相关阅读:
    黑客是如何知道我们常用的密码的
    一个核物理学霸为何两次收到BlackHat的邀请
    透过大数据剖析漫画何去何从
    SJF(最短作业优先)
    RR(轮转调度算法)
    hrrf(最高响应比)
    fcfs
    Process 2(完成版)
    进程2
    进程1
  • 原文地址:https://www.cnblogs.com/lyhabc/p/3327872.html
Copyright © 2020-2023  润新知