我有一个.txt
存储大小为 1253 MB 的文件。将其导入 SQL Server 2016 后,该表占用磁盘空间 1680 MB。为什么存储空间会增长这么多?
我没有做任何数据转换,使用纯char
格式存储数据。我读取txt
文件的数据字典,如果变量的长度最多n
,那么我使用varchar(3)
. 如果文件是固定长度的n
,那么我使用char(n)
.
大约有 4 到 5 列是密集填充的,而所有其他列都非常稀疏。对于稀疏列,只有 1% 的行不为空。
这是创建表和导入数据的代码:
CREATE TABLE table1 (
var1 char(12), var2 char(6), var3 varchar(12), var4 varchar(3),
var5 varchar(3), var6 varchar(4), var7 char(1), var8 char(1),
var9 char(2), var10 char(6), var11 varchar(8), var12 varchar(12),
var13 char(6), var14 varchar(12), var15 varchar(14),var16 varchar(12),
var17 varchar(12), var18 varchar(12), var19 varchar(12),var20 varchar(12),
var21 varchar(12), var22 varchar(12));
如何减少存储空间?
这是来自命令的存储信息sp_spaced
:
名称表 1 行 22260960 保留 1721240 KB 数据 1721128 KB index_size 24 KB 未使用 88 KB
SQL Server 中的列存在元数据存储开销,您不必在平面文件中为此付费。使用压缩可以减少这种开销。从行压缩实现:
尝试使用行或页压缩来压缩您的表,看看这是否会减少 SQL Server 中所需的空间。
根据我的经验,压缩既可以提高也可以降低查询性能。这取决于您正在运行的数据和查询。您可能需要在空间和查询性能之间做出权衡。
探索的另一个选择是使用
SPARSE
列。请参阅文档中的使用稀疏列。请注意,稀疏列与数据压缩(和列存储)不兼容。除了 Joe Obbish 的回答中提到的行和页面压缩选项外,在 SQL Server 2016 中,您还可以使用集群列存储存储。这通常比页面压缩更能减少存储空间,尤其是在使用存档压缩的情况下。
请参阅文档中的列存储索引指南和使用列存储和列存储存档压缩。
导入了多少条记录?确定需要多少存储空间应该相对简单。每个都
char(n)
需要n
字节,每个都varchar(n)
需要(2+输入数据的实际长度)个字节。请参阅产品文档中的char 和 varchar (Transact-SQL)。