《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_id AS  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 ( 4000 null ,
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

 

转载于:https://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值