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

时间:2010-03-05 09:19:56

标签: sql-server database indexing b-tree

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

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

很抱歉,如果这是“Java会取代XML吗?”善意的问题。

更新:

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

常规表中的每一行都可以通过内部ID(但它是特定于数据库)来识别,B-Tree使用该ID来标识该行。在Oracle中,它被称为rowid,看起来像AAAAECAABAAAAgiAAA:)

  

如果我有一个包含数据和表的列表   将在此列上创建索引   索引占用相同数量的光盘   空间作为列本身?

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

考虑1,2,3,4

    1 
  / 
2
   \ 3 
      \ 4

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

答案 1 :(得分:2)

我几乎可以肯定它非常依赖数据库,但一般来说 - 是的,它们需要额外的空间。这是因为两个原因:

  1. 这样你可以利用这个事实 BTREE叶子中的数据被排序;

  2. 您获得查找速度优势     你不必回头     提取必要的东西。

  3. PS刚刚检查了我们的mysql服务器:对于一个20GB的表索引需要10GB的空间:)

答案 2 :(得分:0)

根据这个article判断,它实际上至少占用了与列中数据相同的空间量(无论如何,在PostgreSQL中)。 本文还提出了一种减少磁盘和内存使用的策略。

检查自己的方法是使用例如derby DB,创建一个包含一百万行和一列的表,检查它的大小,在列上创建一个索引并再次检查它的大小。如果您需要10-15分钟,请告知我们结果。 :)