Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL MDF文件大小未更改_Sql_Sql Server 2008 - Fatal编程技术网

SQL MDF文件大小未更改

SQL MDF文件大小未更改,sql,sql-server-2008,Sql,Sql Server 2008,在我的数据库中,最初我有一个包含三列的表,当时没有数据,MDf文件大小为5122KB 然后我在这个表中插入了500000条记录,MDF文件大小增加到19456KB 然后我更新了我的表,并将一列的所有值设置为Null,但文件大小仍然相同,即19456 KB 然后我删除了这个表中的所有记录,但我的MDF文件大小仍然是19456KB 我想知道为什么文件大小没有改变? 列中的空值是否占用空间?要回收空间,需要收缩数据库,因为出于性能原因,这不是自动完成的 更多信息: 列中的空值是否占用空间

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

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

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

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

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

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

更多信息:

列中的空值是否占用空间

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

删除行后,MDF文件不会自动收缩,除非启用了
自动收缩(!)

至于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
查看分配的页面:

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
返回:

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
查看中的第一个数据页

将列设置为Null

UPDATE t SET vc=NULL
前面的查询显示17个页面仍然被分配

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

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