首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL MDF文件大小不变

SQL MDF文件大小不变
EN

Stack Overflow用户
提问于 2010-09-18 20:50:39
回答 2查看 4.9K关注 0票数 4

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

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

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

然后我已经删除了这个表中的所有记录,但我的MDF文件大小仍然是19456 KB。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-18 20:54:19

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

更多信息:

列中的空值会占用空间吗?

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

Stack Overflow用户

发布于 2010-09-18 20:54:28

除非您打开了AUTO_SHRINK (which you shouldn't!),否则MDF文件不会在删除行后自动收缩。

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

但是,即使对于可变长度的列,简单地将列值更新为NULL也可能会导致内部碎片,其中空闲空间分散在数据页中。

要查看此信息,请执行以下操作:

创建表脚本:

代码语言:javascript
复制
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

查看分配的页面:

代码语言:javascript
复制
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'); 

返回:

代码语言:javascript
复制
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

查看 中的第一个数据页

将该列设置为空

代码语言:javascript
复制
UPDATE t SET vc=NULL

前面的查询显示仍分配了17个页面

在SQL内部查看器中再次查看第一个数据页

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3741750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档