估计表的大小(二)--估计带有聚集索引的表的大小

转载 2006年06月25日 19:55:00

估计带有聚集索引的表的大小

下列步骤可用于估计存储带有聚集索引的表上的数据和任何附加的非聚集索引所需的空间。

  1. 计算存储数据所用的空间。

  2. 计算存储聚集索引所用的空间。

  3. 计算存储每个附加非聚集索引所用的空间。

  4. 汇总计算所得的值。

对于每个计算,都要指定将在表中出现的行数。表中的行数将对表的大小有直接影响:

表中的行数 = Num_Rows

计算存储数据所用的空间

有关如何计算存储数据所用空间的更多信息,请参见估计表的大小

记下计算所得的值:

存储数据所用的空间 = Data_Space_Used

计算存储聚集索引所用的空间

下列步骤可用于估计存储聚集索引所需的空间。

  1. 聚集索引定义可以包括固定长度和可变长度列。为了估计聚集索引的大小,需要指定索引行中这两组列的每一组所占用的空间。

索引键中的列数 = Num_CKey_Cols

所有固定长度键列中的字节总和 = Fixed_CKey_Size

索引键中的可变长度列数 = Num_Variable_CKey_Cols

所有可变长度键列的最大值 = Max_Var_CKey_Size

  1. 如果聚集索引中有固定长度列,那么索引行的一部分将为空位图保留。计算大小:

索引空位图 (CIndex_Null_Bitmap) = 2 + (( Num_CKey_Cols + 7) / 8 )

仅使用上述表达式中的整数部分,而去掉其余部分。

  1. 如果索引中有可变长度列,请确定存储索引行中的这些列需使用的空间:

可变长度列的总大小 (Variable_CKey_Size) = 2 + (Num_Variable_CKey_Cols x 2) + Max_Var_CKey_Size

如果没有可变长度列,请将 Variable_CKey_Size 设置为 0

此公式假设所有可变长度键列均百分之百充满。如果预计可变长度键列占用的存储空间比例较低,则可以按照该比例调整结果以对整个索引大小得出一个更准确的估计。

  1. 计算索引行大小:

索引行总大小 (CIndex_Row_Size) = Fixed_CKey_Size + Variable_CKey_Size + CIndex_Null_Bitmap + 1 + 8

  1. 下一步,计算每页的索引行数(每页有 8096 个可用字节):

每页的索引行数 (CIndex_Rows_Per_Page) = ( 8096 ) / (CIndex_Row_Size + 2)

由于索引行不能跨页,所以每页的索引行数应向下舍入到最接近的整数。

  1. 下一步,计算存储索引的每一级别的所有索引行所需的页数。

页数(第 0 级)(Num_Pages_CLevel_0) = (Data_Space_Used / 8192) / CIndex_Rows_Per_Page

页数(第 1 级)(Num_Pages_CLevel_1) = Num_Pages_CLevel_0 / CIndex_Rows_Per_Page

重复第二个计算,将从前面的第 n 级中计算的页数除以 CIndex_Rows_Per_Page,直到指定的第 n (Num_Pages_CLevel_n) 级页数等于 1(索引根页)。例如,若要计算第二个索引级别所需的页数:

页数(第 2 级) (Num_Pages_CLevel_2) = Num_Pages_CLevel_1 / CIndex_Rows_Per_Page

对于每一级别,预计的页数应向上舍入到最接近的整数。

汇总存储各索引级别所需页数:

总页数 (Num_CIndex_Pages) = Num_Pages_CLevel_0 + Num_Pages_CLevel_1 +
Num_Pages_CLevel_2 + ...+ Num_Pages_CLevel_n

  1. 计算聚集索引的大小(每页总共有 8192 字节):

聚集索引大小(字节) = 8192 x Num_CIndex_Pages

计算存储每个附加非聚集索引所用的空间

下列步骤可用于估计存储每个附加的非聚集索引所需空间量。

  1. 非聚集索引定义可以包括固定长度和可变长度列。为了估计非聚集索引的大小,需要计算索引行中这两组列的每一组所占用的空间。

索引键中的列数 = Num_Key_Cols

所有固定长度键列中的字节总和 = Fixed_Key_Size

索引键中的可变长度列数 = Num_Variable_Key_Cols

所有可变长度键列的最大值 = Max_Var_Key_Size

  1. 如果索引中有固定长度列,那么索引行的一部分将为空位图保留。计算大小:

索引空位图 (Index_Null_Bitmap) = 2 + (( Num_Key_Cols + 7) / 8 )

仅使用上述表达式中的整数部分,而去掉其余部分。

  1. 如果索引中有可变长度列,请确定存储索引行中的这些列需使用的空间:

可变长度列的总大小 (Variable_Key_Size) = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

如果没有可变长度列,请将 Variable_Key_Size 设置为 0

此公式假设所有可变长度键列均百分之百充满。如果预计可变长度键列占用的存储空间比例较低,则可以按照该比例调整结果以对整个索引大小得出一个更准确的估计。

  1. 计算非叶级索引行大小:

非叶级索引行总大小 (NL_Index_Row_Size) = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 + 8

  1. 计算每页的非叶级索引行数:

每页的非叶级索引行数 (NL_Index_Rows_Per_Page) =
( 8096 ) / (NL_Index_Row_Size + 2)

由于索引行不能跨页,所以每页的索引行数应向下舍入到最接近的整数。

  1. 计算叶级索引行大小:

叶级索引行总大小 (Index_Row_Size) = CIndex_Row_Size + Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1

最后一个值 1 表示索引行首结构。CIndex_Row_Size 是聚集索引键的索引行总大小。

  1. 计算每页的叶级索引行数:

每页的叶级索引行数 (Index_Rows_Per_Page) = ( 8096 ) / (Index_Row_Size + 2)

由于索引行不能跨页,所以每页的索引行数应向下舍入到最接近的整数。

  1. 根据为非聚集索引指定的填充因子,计算每页保留的可用索引行数。有关更多信息,请参见填充因子

每页的可用索引行数 (Free_Index_Rows_Per_Page) = 8096 x ((100 - Fill_Factor) / 100) / Index_Row_Size

计算中使用的填充因子为整数值,而不是百分数。

由于索引行不能跨页,所以每页的索引行数应向下舍入到最接近的整数。

  1. 计算存储索引的每一级别的所有索引行所需的页数:

页数(第 0 级) (Num_Pages_Level_0) = Num_Rows / (Index_Rows_Per_Page - Free_Index_Rows_Per_Page)

页数(第 1 级) (Num_Pages_Level_1) = Num_Pages_Level_0 / NL_Index_Rows_Per_Page

重复第二个计算,将从前面的第 n 级中计算的页数除以 NL_Index_Rows_Per_Page,直到指定的第 n (Num_Pages_Level_n) 级页数等于 1(根页)。

例如,若要计算第二个和第三个索引级别所需页数:

数据页数(第 2 级) (Num_Pages_Level_2) = Num_Pages_Level_1 / NL_Index_Rows_Per_Page

数据页数(第 3 级) (Num_Pages_Level_3) = Num_Pages_Level_2 / NL_Index_Rows_Per_Page

对于每一级别,预计的页数应向上舍入到最接近的整数。

汇总存储各索引级别所需页数:

总页数 (Num_Index_Pages) = Num_Pages_Level_0 + Num_Pages_Level_1 +Num_Pages_Level_2 + ...+ Num_Pages_Level_n

  1. 计算非聚集索引的大小:

非聚集索引大小(字节) = 8192 x Num_Index_Pages

计算表的大小

计算表的大小:

  • 表的总大小(字节) = Data_Space_Used + Clustered index size + Nonclustered index size + ...n

postgresql查看表和索引大小函数

  • 2015年08月18日 15:20
  • 1KB
  • 下载

MySql-聚集索引-表为什么必须有主键

前几天跟搞C++游戏服务器一同事联动实现一个业务,看到他创建表默认没有主键,于是我建议他添加,同事铮铮有词说,业务根本用不着,多一个字段多浪费,我瞬间无语,于是跟他解说为什么必须添加?针对MySQL5...

实战:mysql统计指定架构的所有表的数据和索引大小情况-v2

方便mysql统计指定架构的所有表的数据和索引大小情况-v2

系统性能的提升之二--"聚集索引"的建立[转]

以前对数据库也有过一段时间的研究,对数据库的物理存储机制也有所了解,刚看了freedk 写的《SQL Server 索引结构及其使用》受益非浅,我也真的意识到,数据库索引对系统性能的重...

innodb表的聚集索引和普通索引的区别(从数据存储角度),组合索引和单列索引的区别.

innodb 聚集索引和普通索引 Innodb 聚集索引是按照主键(primarykey)进行聚集,被索引的列其实是主键列,如果没定义主键,Innodb会试着使用唯一非空索引Unique Ind...

MySQL索引 聚集索引

  • 2017年10月17日 14:48
  • 566KB
  • 下载

Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引, 然后又扯到了目录查找来帮助读者记忆。。。。问题就在这里,我们不是学文科,...

获取数据库内表大小的工具

  • 2014年03月13日 17:47
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:估计表的大小(二)--估计带有聚集索引的表的大小
举报原因:
原因补充:

(最多只允许输入30个字)