我有一个'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
少?或者发生了什么?
此时此机器上没有其他进程(本地/本地计算机)。
答案 0 :(得分:2)
bigint
占用8个字节,int
占用4个字节,但磁盘空间取决于整行。
更重要的是,包含表的文件的物理大小也取决于死元组(表膨胀)。 VACUUM
(通常只有VACUUM FULL
)可以减少表的物理大小。您的ALTER TABLE
导致整个表重写,膨胀表。但它也使后来的VACUUM
(或VACUUM FULL
)只使用死元组修剪数据页面变得简单 - 有效地压缩了表格。 VACUUM
由autovacuum
自动使用默认设置运行(但不是VACUUM FULL
)。
除了这种副作用之外,将列从int
更改为bigint
永远不会减少行大小(不会膨胀)。有时它保持不变,因为前一行有4个字节的对齐填充,bigint
可以使用它。或者行大小增加另一个(通常)8个字节。
答案 1 :(得分:0)
为了清楚起见 - 只有VACUUM FULL
可以减少表使用的磁盘空间。即使这并非总是如此 - 如果可以删除某些页面,则依赖于数据文件页面中已删除元组的数量。它创建了新的数据文件。
普通VACUUM
仅通过删除已删除的元组释放现有数据文件页面中的空间,但不会降低数据文件中已分配页面的数量。并且不会创建新的数据文件。