我试图了解SQLServer如何分配和保留空间。

已经运行了“表设计如何影响SQL Server性能”一文中的示例了吗[1] ,我收到的结果[My 1.1]与第[1.1]条中的结果不同。
为什么?

为什么在一种情况下会保留/分配过多的空间(所有情况都在[1]中),而在另一种情况下不会保留/分配过多的空间[My 1.1]?


我如何控制/管理它?

[1] ======
表设计如何影响SQL Server性能?
http://sqlserver-training.com/how-table-design-can-impact-your-sql-server-performance


我的结果偏离了下面的[1]

name                               rows  reserved  data     index_size  unused
---------------------------------- ----- --------- -------- ----------- ---------
Fixed_Lenght_Row_Table_Optimised   10000 40008 KB  40000 KB 8 KB        0 KB

导致[1]从上方矿井转移

name                               rows  reserved  data     index_size  unused
---------------------------------- ----- --------- -------- ----------- ---------
Fixed_Lenght_Row_Table_Optimised   10000 40072 KB  40000 KB 8 KB        64 KB

[1.2]
[1]的结果与我的一致

name                                 rows  reserved  data     index_size  unused
----------------------------------   ----- --------- -------- ----------- ---------
Fixed_Lenght_Row_Table_Non_Optimised 10000 80072 KB  80000 KB 8 KB        64 KB
2 回复  |  直到 14 年前
    1
  •  3
  •   Remus Rusanu    14 年前

    链接中的文章充其量是可疑的。不指定要使用的SQL Server版本,以及启用/禁用的各种选项。自SQLServer2005以来,对于超过8K限制的列,存在行小lob存储(请参见 Table and Index Organization ),有默认的行内和行外选项(请参见 sp_tableoption )还有很多压缩选项( row-level , page-level , Unicode ).

    Planning and Architecture (Database Engine) . 为了更容易理解,买一本老套的书,比如 Microsoft SQL Server 2008 Internals Inside Microsoft SQL Server 2005: The Storage Engine

        2
  •  3
  •   gbn    14 年前

    这是有道理的:你有64k未使用的空间。在这样的保留空间中,您经常会看到一些细微的差别

    我也会用第二个参数这样运行它。可能没什么区别

    EXEC [sp_spaceused][1] 'Fixed_Lenght_Row_Table_Non-Optimised', 'true'
    

    然后从空间使用

    当您删除或重建大型 索引,或删除或截断大 表,数据库引擎延迟 实际的页面释放,以及它们的 关联锁,直到 操作不释放分配的 马上离开。因此 sp\u spaceused返回的值 落下或 截断一个大对象可能不会 反映实际磁盘空间 可用。有关的详细信息 延迟分配,请参阅删除和删除