zoukankan      html  css  js  c++  java
  • 《Microsoft Sql server 2008 Internals》读书笔记第五章Table(3)

     《Microsoft Sql server 2008 Internals》读书笔记订阅地址:

    http://www.cnblogs.com/downmoon/category/230397.html/rss

    《Microsoft Sql server 2008 Internals》索引目录:

    《Microsoft Sql server 2008 Internal》读书笔记--目录索引

    在上一篇中,我们主要学习了如何在系统视图中察看我们创建表和索引的元数据信息,今天,我们继续学习数据存储的元数据结构。
    数据存储元数据(Data Storage Metadata)

    还记得Haep吗?,就是没有聚集索引的表。每一个Heap和索引都在sys.indexes视图中有一行记录,SQL2008中每个表和索引能被 存储在多个分区中。sys.Partitions包含一个Row对应于每一个Heap或索引的分区。每一个Heap或索引至少有一(到1000)个分区, 即使你没有定义分区结构。因此,sys.indexes与sys.Partitions是一对多的关系,在SQL2008中用了一个词"hobt" (Heap Or B-Tree)来称谓表或索引在一个分区中的子集(subset),所以在sys.partitions中有一列是hobt_id。实际 上,hobt_id和partition_id是一一对应关系。这两列的值也完全一样。

    示例:

    代码
    CREATE TABLE dbo.employee( 
                   emp_lname  
    varchar(15)   NOT NULL
                   emp_fname  
    varchar(10)   NOT NULL
                   address    
    varchar(30)   NOT NULL
                   phone      
    char(12)      NOT NULL
                   job_level  
    smallint      NOT NULL 
    );
    go
    alter table dbo.employee 
    add Emp_ID int    identity(1,1)
    alter table dbo.employee
    add constraint PK_Employee primary key (Emp_ID)
    go
    SELECT  object_id, name, index_id, type_desc 
    FROM sys.indexes 
    WHERE object_id=object_id('dbo.employee');

    结果:
    邀月工作室
    每一个分区(无论是一个Heap或者索引)能存储三种类型的行,分别存储在自己特定的页面(pages)中。即in-row data pages(可以理解为规则数据)、row-overflow data pages和LOB data pages。针对于一个特定分区的一个特定的页面被称为allocation unit(分配单元),每个分区在视图sys.allocation_units中有多个行,因为每个分区我们多个分配单元。总有一个分配单元针对n- row data,也可能有分配单元针对LOB data和row-overflow data,下图展示了这种关系:
    邀月工作室

    查询目录视图 (Querying Catalog Views)

    其实前面已经多次应用,这里我们再练习一下sys.allocation_units

    代码
    SELECT object_name(object_idAS name,  
        partition_id, partition_number 
    AS pnum,  rows,  
        allocation_unit_id 
    AS au_id, type_desc as page_type_desc, 
        total_pages 
    AS pages 
    FROM sys.partitions p JOIN sys.allocation_units a 
       
    ON p.partition_id = a.container_id 
    WHERE object_id=object_id('dbo.employee');

    结果如下:
    邀月工作室

    再增加不“规则列”

    alter table dbo.Employee 
    add Desc_Long Nvarchar(4000null,
    Notes 
    text null,
    LongVar 
    Nvarchar(max)

    结果:

    邀月工作室

    你也可发创建一个或两个索引来测试索引视图,应该注意到仅仅增加一个聚集索引并不会改变sys.allocation_units的行数,但却改变 了partition_id 数字,因为创建一个聚集索引的时候表完全被内部重建了 。你可以从以下语句的结果中看到这个差异:

    代码
    SELECT  convert(char(8),object_name(i.object_id)) AS table_name, 
        i.name 
    AS index_name, i.index_id, i.type_desc as index_type,
        partition_id, partition_number 
    AS pnum,  rows, 
        allocation_unit_id 
    AS au_id, a.type_desc as page_type_desc, 
        total_pages 
    AS pages
    FROM sys.indexes i JOIN sys.partitions p  
            
    ON i.object_id = p.object_id AND i.index_id = p.index_id
        
    JOIN sys.allocation_units a
            
    ON p.partition_id = a.container_id
    WHERE i.object_id=object_id('dbo.employee');

    大家可能注意到rows和Pages都是0,那是因为我们还没有插入任何数据。

    到目前为止,我们并没有查询关于page的分配信息情况。在SQL2000中sysindexes表包含了三列关于空间分配的信 息:first,root和firstIAM,

    在SQL2008中这三个列名改为first_page,root_page,和first_iam_page,但只在MSDN未 公开的sys.system_allocation_units中可以查到。 而公开的一个视图是sys.allocation_units。看来,微软还是藏了不少压箱货啊!呵呵。

    关于更多的目录视图的知识,请看MSDN:

    http://msdn.microsoft.com/zh-cn/library/ms174365%28SQL.90%29.aspx

    下一节将更深入学习数据页Data Pages

    邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
    助人等于自助!  3w@live.cn
  • 相关阅读:
    [探索][管理]《现在,发现你的优势》
    【成功智慧】010.依靠忍耐度过困难时期
    爱情五十九课,就差一句话
    VSS2005 托管 VS2010代码
    一个网站的金字塔战略
    【成功智慧】013.脚踏实地的去做,没有完不成的任务
    MU.Bread 麦卡优娜
    【成功智慧】012.要有耐心去等待成功的到来
    【成功智慧】009.要能够承受所发生的事情
    【成功智慧】014.一日复一日的度过难关
  • 原文地址:https://www.cnblogs.com/downmoon/p/1657140.html
Copyright © 2011-2022 走看看