SQL考试 - 估计表大小问题

时间:2009-12-18 21:44:15

标签: sql sql-server sql-server-2005

我正准备参加SQL Server考试(70-431)。我收到了Sybex "SQL Server 2005 - Implementation and Maintenance"的书。我对估计一张桌子的大小感到困惑。

在第2章中解释了如何执行此操作:

  1. 从公式Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + Row_Header计算行大小。
    • Fixed_Data_Size是所有大小的固定长度列的总和(简单总和)
    • Variable_Data_Size = 2 + (num_variable_columns × 2) + max_varchar_sizenum_variable_columns - 可变长度的列数max_varchar_size - varchar列的最大大小
    • null_bitmap = 2 + ((number of columns + 7) ÷ 8)(向下舍入)
    • Row_header始终等于4
  2. 从公式计算每页的行数:Rows_Per_Page = 8096 ÷ (Row_Size + 2)(向下舍入)
  3. 估算表格中的行数。假设该表有1,000行。
  4. 计算所需的页数:No_Of_Pages = 1,000 / Rows_Per_Page(向上舍入)
  5. 总大小:Total_Size = No_Of_Pages * 8,192,其中8,192是一页的大小。
  6. 所以一切都非常清楚。我做了一个例子,并用书中的答案检查我的计算是否正确。但有一个问题让我困惑。

    问题是:我们有一个包含以下架构的表:

    Name       Datatype
    -------------------
    ID         Int
    VendorID   Int
    BalanceDue Money
    DateDue    Datetime
    

    预计在此表中将有大约5,000行。问题(文字):“应收款管理系统表格将占用多少空间?”

    所以我的答案很简单:

    null_bitmap = 2 + ((4+7) / 8) = 3.375 = 3 (rounded)
    fixed_datasize =  4 + 4 + 8 + 8 = 24
    variable_datasize = 0
    row_header = 4 (always)
    
    row_size = 3 + 24 + 0 + 4 = 31
    

    但在答案中,他们省略了row_header并且他们没有添加4。这是书中的错误还是仅在某些情况下添加了row_header(书中没有提到)?我想可能只有在表中有可变长度字段时才添加row_header,但是还有另一个练习,其中没有可变长度字段并且添加了row_header。如果有人解释我,我将不胜感激。感谢。

1 个答案:

答案 0 :(得分:3)

Inside the Storage Engine: Anatomy of a record表示所有记录都有记录标题:

  

记录结构如下:

     
      
  • 记录标题      
        
    • 4个字节长
    •   
    • 两个字节的记录元数据(记录类型)
    •   
    • 记录中向前指向NULL位图的两个字节
    •   
  •