SQL-Server索引漫谈

2022-08-11 00:00:00 索引 数据 插入 结构 聚集

一. SQL-Server数据存储基本单位

    [文章排版比较乱,所以还请读者体谅一下,后续如果有时间会重新整理一下]这篇文章讨论的主题是索引,但在正式进入索引的内容前,想简单介绍一下关于SQL-Server数据存储的一些简单认识,这将帮助我们更好地理解索引的结构。在SQL-Server中,数据存储的基本单位是页,一页的大小是8KB(共8192字节)。

  


  1. 页首

    页首固定占用每个数据页的96字节,保存了页面系统信息。下表列出了部分具体信息:

  pageID: 数据库中该页的文件编号和页编号

  nextPage:如果该页位于一个页链中,则该字段表示下一页的文件编号和页编号

  pervPage:如果该页位于一个页链中,则该字段表示上一页的文件编号和页编号

  Metadata:ObjectId:该页所在对象的ID

  indexId:该页的索引ID(0为数据页)

  2. 行内数据的数据行

    数据行是真实数据的存储区域。每一行的大小是不固定的,以Slot为单位,0开始编号,Slot0,Slot1依次类推。

  3. 行偏移数组

    用于记录该数据页中每个Slot的相对位置,便于快速定位Slot的位置。例如:行偏移数组槽0可以指向偏移0X60(96字节)的Slot0。行偏移数组的每个记录占两个字节。行偏移数组表示的是数据页上面的逻辑顺序。例如Slot0可以指向0X80,而Slot1可以指向0X60,实际存储的物理位置不一定按照(聚集索引)排序的。

二. 什么是索引

  数据库索引是对表的一列或多列的值进行排序的一种结构,索引与表数据的关系类似于目录与书籍内容的关系。在SQL-Server中存在两种比较重要的索引,分别为聚集索引与非聚集索引,它们是以B+树组织保存的。

  建立索引也要付出额外代价的: 索引需要占据额外的内存空间 (当创建一张新表table_name后,并插入数据,使用sp_spaceused(table_name)就可以查看当前索引使用了多少内存,但必须注意sp_spaceused是每个数据库都有的一个系统存储过程,在使用的时候必须指明要查询的数据库) ; 插入和修改数据需要涉及索引的改动,将花费更多的时间。

三. 为什么要使用索引

   众所周知,数据查询是数据库一项使用非常频繁的操作,查询的快慢已成为了衡量系统好坏的一个重要标准,而合理地使用索引可以提高数据检索效率,改善数据库性能,加快数据访问速度。

四. 堆结构

  1. 什么是堆结构

     堆的本义是杂乱无章,无序的意思。对于未建立聚集索引的表,数据是没有遵循特定的某种规则排序的,表中的所有数据页就形成了堆结构。

  2. 堆结构实例

--接下来的数据库语句操作都是一些简单的命令--数据库为Test
USE Test
GO

--创建一张table
CREATE TABLE t1
(
t1_id INT NOT NULL
)
GO

--查看t1的使用情况
sp_spaceused t1

相关文章