1

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

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

为什么在一种情况下保留/分配了过多的空间([1] 中的所有情况),但在另一种情况下没有 [My 1.1]?
(请注意,在 [1] 中,在两种情况下都保留了过多的空间,尽管在我的计算机上仅在其中一种情况下)

SQL Server 如何分配、保留空间?
我该如何控制/管理它?

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

[我的 1.1]
我的结果从下面的 [1] 转移

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

[1.1] 结果 [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
4

2 回答 2

3

链接中的文章充其量是可疑的。不指定要使用的 SQL Server 版本,以及启用/禁用的各种选项。由于 SQL Server 2005 存在超过 8K 限制的列的行小 lob 存储(请参阅表和索引组织),因此有默认的行内与行外选项(请参阅sp_tableoption)并且有许多压缩选项(行级页级Unicode)。

对于准确的信息,我会坚持从Planning and Architecture (Database Engine)开始的官方产品文档。为了更易于阅读,请购买一本成熟的书籍,例如Microsoft SQL Server 2008 InternalsInside Microsoft SQL Server 2005: The Storage Engine

于 2010-09-23T19:26:32.390 回答
3

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

我也会使用第二个参数以这种方式运行它。可能没什么区别

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

然后从 sp_spaceused

当您删除或重建大型索引,或者删除或截断大型表时,数据库引擎会将实际的页面释放及其关联的锁推迟到事务提交之后。延迟删除操作不会立即释放分配的空间。因此,sp_spaceused 在删除或截断大对象后立即返回的值可能无法反映实际可用的磁盘空间。有关延迟分配的更多信息,请参阅删除和重建大对象。

最后,您是否会有包含 4000 字节以上行的表?如果您想重写以进行优化,我会说您为时过早...只需使您的设计实现正确(它们是单独的步骤)

于 2010-09-23T19:44:44.327 回答