DB索引是否占用与列数据相同的磁盘空间量?

Val*_*yev 6 database sql-server indexing b-tree

如果我有一个包含数据的表列并在此列上创建索引,索引是否会占用与列本身相同的磁盘空间量?

我很感兴趣,因为我试图理解b-tree是否真的保留了叶子节点中列数据的副本,或者它们以某种方式指向它?

对不起,如果这是"Java会取代XML吗?" 善意的问题.

更新:

使用单个GUID列创建了一个没有索引的表,添加了1M行--26MB

与主键相同的表(聚簇索引) - 25MB(甚至更少!),索引大小 - 176KB

具有唯一键的相同表(非聚集索引) - 26MB,索引大小 - 27MB

因此,只有非聚簇索引占用的空间与数据本身一样多.

所有测量都在SQL Server 2005中完成

ewe*_*nli 4

B-Tree 指向表中的行,但 B-Tree 本身仍然占用一些磁盘空间。

有些数据库有专门的表,其中嵌入了主索引数据。在Oracle中,它被称为IOT——索引组织表。

常规表中的每一行都可以通过内部 ID(但它是特定于数据库的)来标识,B 树使用该内部 ID 来标识行。在 Oracle 中,它的名称rowid和外观如下AAAAECAABAAAAgiAAA:)

如果我有一个包含数据的表列并在此列上创建索引,那么该索引是否会占用与该列本身相同的磁盘空间量?

在基本 B 树中,节点数与列中的项目数相同。

考虑1,2,3,4

    1 
  / 
2
   \ 3 
      \ 4
Run Code Online (Sandbox Code Playgroud)

确切的空间仍然可能有点不同(索引可能更大一点,因为它需要存储节点之间的链接,它可能不完美平衡等),我猜数据库可以使用优化来压缩部分索引。但索引和列数据的数量级应该是相同的。