SQL MDF文件大小不变

时间:2010-09-18 12:50:39

标签: sql sql-server-2008

在我的Db中,最初我有一个包含三列的表,当时没有数据,MDf文件大小为5122 KB。

然后我在此表中插入了500000条记录,MDF文件大小增加到19456 KB

然后我更新了我的表,并将一列的所有值都设为Null,但文件大小仍然相同,即19456 KB。

然后我删除了此表中的所有记录,但我的MDF文件大小仍为19456 KB。

我想知道为什么文件大小没有变化? 列中的Null值是否占用空间?

2 个答案:

答案 0 :(得分:7)

除非您AUTO_SHRINK已启用NULL,否则删除行后MDF文件不会自动缩小!{/ p>

关于NULL是否占用空间,它取决于数据类型。在固定长度列中,仍将为包含NULL值的行中的列分配全部空间。对于变量,它不会。

但即使对于可变长度列,只需将列值更新为CREATE TABLE dbo.t ( id INT IDENTITY PRIMARY KEY, vc VARCHAR(4000) ) INSERT INTO t SELECT TOP 26 replicate(char(64 + row_number() OVER( ORDER BY (SELECT 0))), 4000) AS rn FROM sys.objects ,就可能会在内部碎片中留下可用空间分散在数据页中的内容。

要看到这个:

创建表脚本:

SELECT CONVERT(CHAR(10), object_name(i.object_id)) AS table_name,
       CONVERT(CHAR(16), i.name)                   AS index_name,
       i.index_id,
       CONVERT(CHAR(10), i.type_desc)              AS index_type,
       partition_number                            AS pnum,
       rows,
       CONVERT(CHAR(12), a.type_desc)              AS page_type_desc,
       total_pages                                 AS pages
FROM   sys.indexes i
       JOIN sys.partitions p
         ON i.object_id = p.object_id
            AND i.index_id = p.index_id
       JOIN sys.allocation_units a
         ON p.partition_id = a.container_id
WHERE  i.object_id = object_id('dbo.t'); 

查看已分配的网页

table_name index_name       index_id    index_type pnum        rows                 page_type_desc pages
---------- ---------------- ----------- ---------- ----------- -------------------- -------------- --------------------
t          PK__t__7C8480AE  1           CLUSTERED  1           26                   IN_ROW_DATA    17

<强>返回:

UPDATE t SET vc=NULL

查看which you shouldn't

中的第一个数据页

SQL Internals Viewer

将列设置为Null

{{1}}

上一个查询显示仍然分配了17个页面

在SQL Internals Viewer中再次查看第一个数据页

enter image description here

可以看出原始数据仍然存在,并且没有自动重新排列行以回收空间。

答案 1 :(得分:5)

要回收缩小数据库所需的空间,因为出于性能原因,这不会自动完成。

更多信息:

  

列中的Null值是否占用空间?

  • 对于可变宽度列,NULL值不占用存储空间。
  • 对于固定宽度列,NULL值需要与任何其他值相同的存储空间。
  • 此外,使列可以为空可以在某些情况下为每行添加开销以存储可空的位图。