• SQL Server性能优化(8)堆表结构介绍


    一、表结构综述

    下图是SQL Server中表的组织形式(其中分区1、分区2是为了便于管理,把表进行分区,放到不同的硬盘数据文件里。默认情况下,表只有一个分区。)。表在硬盘上的存放形式,有堆和B树两种形式。

    具有分区的表组织结构

    图最下方的三个叶子节点,数据、LOB、行溢出是数据在硬盘上存放数据的集合。可以这么理解,SQL Server在硬盘上一个数据页是8k,页有三种类型、分别为:数据、LOB、行溢出。关于页的结构,可参考页和区:https://technet.microsoft.com/zh-cn/library/ms190969(v=sql.105).aspx

    数据(IN_ROW_DATA):包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。页的类型是data或者index。

    LOB(LOB_DATA):一些大型对象数据,如:text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 等。页的类型为 Text/Image。

    行溢出(ROW_OVERFLOW_DATA):如果某些数据太大以至于超过1个数据页。

    二、堆的结构

    堆是不含聚集索引的表(所以只有非聚集索引的表也是堆)。在数据库文件中,对于堆使用的每个分区,都有 index_id = 0。

    数据没有任何方式的排序,它就是一个无序堆,无结构关联的记录。当你使用SELECT语句访问堆表时,SQL Server在执行计划里会使用表扫描(Table Scan)运算符,因为你没有定义合适的聚集索引。(堆表)没有表查找(Table Seek)这个运算符。这点非常重要。

    在堆表你只有一个表扫描(Table Scan)运算符。表扫描意味着你必须扫描整张表,不以你表拥有的数据量来衡量。你的数据量越多,操作花费(时间)越长。。

    sys.system_internals_allocation_units 系统视图中的列 first_iam_page 指向管理特定分区中堆的分配空间的一系列 IAM 页的第一页。SQL Server 使用 IAM 页在堆中移动。堆内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的信息。(参考http://www.cnblogs.com/chenmh/p/4359171.html

    image

    即,查找堆内数据的时候是从IAM页面进行查询的。关于IAM页面请参考上一篇文章。

    1. IAM用于查找分配给堆的所有数据页信息,IAM页中记录了所有的页面的页id。

    2. 对于大多数较小的堆表来说,仅需要一个IAM页就可以管理其页面。

    3. 若堆表大于4GB或包含LOB数据类型的话,则会包含多个IAM页面。

    4. 当查询要获取堆表的记录时,SQL Server使用IAM页来扫描堆表,是性能最差的一种查询方法。

    三、堆表的优点

    堆表插入数据非常快。分配一个8kb 的新页,在那页写上新的纪录,不需要保证任何的排序。

    因此在数据库架构里,这样的表设计有些时候是非常好的主意:这些表只有海量(huge)并行(parallel)的INSERT活动。

    参考:

    1. SQL Server 深入解析索引存储(中)

    2. 关于什么时候使用堆表:http://kejser.org/clustered-indexes-vs-heaps/

  • 相关阅读:
    .NET:CLR via C# The CLR’s Execution Model
    VisualStudio:WEB 性能测试和负载测试 入门
    Maven:Maven 入门
    技术人生:东莞之行
    技术人生:新的生活计划
    Java:使用 Java 开发的一个异常处理框架
    .NET:命令行解析器介绍
    技术人生:希望有生之年开发一个“自己的解释语言”
    .NET:异常处理的两条“黄金定律”,求批!
    FAQ:Domain Event 和 C# 中的 Event 有啥区别?
  • 原文地址:https://www.cnblogs.com/ustcyc/p/4524122.html
Copyright © 2020-2023  润新知