堆表的在执行Select语句时的默认排序问题——分析问题

来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:42 点击:

首先,看了一下出库单主表的数据结构,出库单主表中既没有主键也没有索引,经过分析原因如下:
 
对于Sql Server 执行计划没有带索引的表,select返回记录的顺序和堆表扫描返回的顺序相同。通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,意味着堆集中的行一般不按照插入的顺序返回。堆表(heap table)数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。
 
没有聚集索引的表称作堆数据表(heap table)。即数据行不按任何特殊的顺序存储,数据页也没有任何特殊的顺序。数据页不在链接列表内链接。 SQL Server 使用 IAM 页在堆中移动。堆内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的信息。 
   www.2cto.com  
接下来说一下IAM,IAM(Index Allocation Map,索引分配映射)页用来跟踪单个文件中约4G大小的空间,跟踪的空间是按4G字节对齐。被跟踪的这4G大小的页被称为“GAM区间”(GAM Interval)。IAM页所跟踪的GAM区间中的空间是属于同一对象的。
 
因为IAM只是跟踪单个文件里的一个GAM区间里的空间。若一个数据库包括多个文件,或者一些文件大小超过4G,并且实体分配的空间恰好跨越多个文件或跨越一个文件的多个GAM区间,那么你就会看到为了跟踪单个实体的所有空间是如何使用多个IAM页的了。
 
这时就要用到IAM链了。它是一个IAM页的链表,该链表将所有用来跟踪同一实体的分配空间的所有IAM页链接在一起。该链表并不排序,当需要一个新的IAM页时便添加进链表。链表中的IAM页是编号的,这个编号也是按添加时的顺序增加的。
 
IAM页头部还有一个单页的数组。这只是在IAM链中的第一个IAM页中,这个数组只存在IAM 链中的第一个页中(因为整个IAM 链中只需要跟踪8 个单独分配的页)而不是区(一个区是8个连续的页)的。(注:前8页是按页在混合区中分配的;超过8个页后才开始按区分配)
 
IAM: Single Page Allocations @0x3D4FC08E(单页分配数组)
Slot 0 = (1:946)              Slot 1 = (1:1697)                    Slot 2 = (1:804)
Slot 3 = (1:184)              Slot 4 = (1:949)                     Slot 5 = (1:816)
Slot 6 = (1:3168)             Slot 7 = (1:1348) 
 
你会发现上面Slot0---Slot7把所有的单页分配数组都已经满了 , 然后转向分配统一区。第一个有效的区开始于3200页,一直到3208页开始的区。如下。  www.2cto.com  
IAM: Extent Alloc Status Slot 1 @0x3D4FC0C2
(1:0)        - (1:3192)     = NOT ALLOCATED       
(1:3200)     -              =     ALLOCATED           
(1:3208)     - (1:3776)     = NOT ALLOCATED   
 
关于IAM 页还要注意两件事:
· IAM页是从混合区中分配而来的,且这些页不受监控。
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • LINUX上RMAN自动备份脚本
  • sql server 列转行
  • SQL SERVER2008日常自动化备份
  • SQL Server 2005 镜像构建手册
  • SQL编程(一)
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1