在SQL中删除特定的列数据,而不删除整个行

时间:2019-11-12 11:24:29

标签: sql sql-server

我在SQL Server中有一个表,其中一列包含excel文件。

现在,我们只需要删除那些excel文件,而无需删除整行。由于此表的大小每天都在增加,因此我们需要     删除旧数据以减小此表的大小

Id      file_name  Code
1001    abc.xlsx   A1
1002    das.xlsx   A2
1003    kap.xlsl   A3

我已经完成以下

Update rec_table 
 set file_name = Null where id = '1001'

这将有助于减少表格的大小吗?

谢谢

2 个答案:

答案 0 :(得分:1)

在SQL Server中,表的大小是通过将表中每一行的Sie相加来计算的。即,如果一个表有10行,则表的总大小将是10行的总大小之和。

对于行,总大小是通过计算每列的大小来计算的。

以您的情况为例,ID为1001的行的大小为

  

列ID中的值大小+列名中的值大小+列代码中的值大小

因此,如果某列的特定行的值为NULL,则该列的数据大小为0

将特定列的值更新为NULL将减小该列的大小,但是减少多少将取决于该列的类型和存储在其中的数据

这意味着,如果您的列File_name的行ID为1001的数据为100字节,则将值更新为NULL将使表大小减少100字节

您可以使用以下查询找出表格/行大小

用于获取整个表格的大小和详细信息

dbcc showcontig ('Person.Person') with tableresults

获取数据库中每一行的特定列的数据大小

SELECT DATALENGTH(FirstName) FROM Person.Person

答案 1 :(得分:1)

这会减少表格的大小吗?可能。

此功能将释放数据库的可用空间吗?可能不会-直到压缩数据库为止。

这是一项昂贵的手术吗?非常。

数据库将表存储在数据页上。每个数据页包含一个或多个行。如果您有宽列,则这些列可能会存储在自己的数据页上。

适合页面的行数取决于行的大小。一个页面大约8k字节。如果一行为100字节,则一行为1的表所占用的空间与一行50的表所占用的空间相同。

从表中删除列时,整个表都需要重写。 这是一个非常昂贵的操作。这可能需要很长时间。通常,选择所需的列并重新加载原始表会更快。

对我来说,删除列是减小表大小的一种非常奇怪的方法。通常,较旧的数据将被删除。最有效的方法是使用适当的日期/时间列进行按时间对表进行分区。然后,您可以通过删除分区来快速恢复空间。