将列类型从int更改为bigint可以释放空间吗?

时间:2016-12-08 16:37:39

标签: postgresql database-design storage postgresql-9.5 vacuum

我有一个'Add a reference to Microsoft Scripting Runtime. Private Sub Export_Click() Application.ScreenUpdating = False Application.DisplayAlerts = False With New Scripting.FileSystemObject Dim filePath As String Dim targetDir As String targetDir = .BuildPath(ThisWorkbook.Path, "Uploads") If Not .FolderExists(targetDir) Then MsgBox ("ERROR! Please make sure you have a folder named Uploads next to the template file") Exit Sub End If filePath = .BuildPath(targetDir, ActiveSheet.Range("A2").Value & "_Upload.csv") End With 'Copies the sheet to a new workbook: Dim csv As Workbook Set csv = Application.Workbooks.Add With csv ThisWorkbook.Sheets("UploadData").Copy .Sheets(1) .SaveAs Filename:=filePath, _ FileFormat:=xlCSV, _ CreateBackup:=False 'Closes the file .Close xlDoNotSaveChanges End With 'Reopen and re-save to fix formatting. Set csv = Workbooks.Open(filePath) csv.Close xlSaveChanges Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub 类型列的表,在一个约15 M行的表中 操作系统Windows 7和C盘(安装了postgres)显示:

  

59 GB,不含238 GB

然后我将此列类型更改为int

bigint

现在,C盘:

  

61 GB,不含238 GB

如何释放2 GB?看起来ALTER TABLE mytable ALTER column col TYPE bigint; 占用的空间比bigint少?或者发生了什么?

此时此机器上没有其他进程(本地/本地计算机)。

2 个答案:

答案 0 :(得分:2)

bigint占用8个字节,int占用4个字节,但磁盘空间取决于整行。

更重要的是,包含表的文件的物理大小也取决于死元组(表膨胀)。 VACUUM(通常只有VACUUM FULL)可以减少表的物理大小。您的ALTER TABLE导致整个表重写,膨胀表。但它也使后来的VACUUM(或VACUUM FULL)只使用死元组修剪数据页面变得简单 - 有效地压缩了表格。 VACUUMautovacuum自动使用默认设置运行(但不是VACUUM FULL)。

除了这种副作用之外,将列从int更改为bigint 永远不会减少行大小(不会膨胀)。有时它保持不变,因为前一行有4个字节的对齐填充,bigint可以使用它。或者行大小增加另一个(通常)8个字节。

答案 1 :(得分:0)

为了清楚起见 - 只有VACUUM FULL可以减少表使用的磁盘空间。即使这并非总是如此 - 如果可以删除某些页面,则依赖于数据文件页面中已删除元组的数量。它创建了新的数据文件。

普通VACUUM仅通过删除已删除的元组释放现有数据文件页面中的空间,但不会降低数据文件中已分配页面的数量。并且不会创建新的数据文件。