数据库中空值使用的空间

时间:2009-02-17 11:21:48

标签: sql sql-server database null

如果列为null,是否会影响列使用的空间? 使用的空间是否由列定义固定? 这是因数据库而异。 (我主要对SQL Server 2000感兴趣。)

澄清: 这个问题与该专栏“可空”时会发生什么有关(这与Kritsen& gbn所指出的另一点相关)。问题是,当列实际为空(在某个特定行中)时是否存在任何保存。

...

Cadaeic提供了SQL Server的答案,在2008版本之前似乎没有节省SQL Server,而根据Quassnoi,如果空列结束,您可以节省Oracle。谢谢你的答案,他们都很有帮助。

6 个答案:

答案 0 :(得分:19)

在列中存储NULL不会特别花费或节省空间。对于固定长度的数据,整个空间仍然保留。

另一方面,可变长度数据仅需要数据的长度加上开销来存储实际长度。例如,VARCHAR(n)将使用2个字节的数据来指示实际长度,因此所需的存储空间始终为n + 2.

此外,应该提到的是,如果SET ANSI_PADDING ON,具有NULL值的char(n)将表现为VARCHAR(n)。

无论如何,在使用SQL Server 2000或SQL Server 2005时,您将无法识别存储NULL的空间“节省”.SQL Server 2008引入了稀疏列的概念,可以为主要为NULL的列节省成本。

答案 1 :(得分:10)

SQL Server有一个指示NULL的位。如果列定义为NOT NULL

,则不使用此位

VARCHAR使用可变长度来存储数据(因此具有指示实际数据有多长的开销),而CHAR是固定宽度。

因此在此基础上,CHAR(1)NOT NULL比VARCHAR(1)NOT NULL“更短”,因为VARCHAR需要长度指示符,而CHAR将始终只使用一个字节。

编辑:请注意,拥有允许NULL的BIT字段需要两位来存储它!我经常看到没有考虑过的BIT字段,不需要存储NULL但是没有设置为NOT NULL因此无意中浪费了

答案 2 :(得分:3)

Oracle中,它取决于列的类型及其在行中的位置。

如果NULL列在行中的最后一列,则它们根本不占用任何空间。 Oracle将每行的总行大小预先设置为行,不适合的所有内容都被视为NULL

如果在NULL列之后有一些非NULL数据,那么NULL将存储为0xFF的单个字节(即{{1} }} type。。

NULL相当于VARCHAR2。如果您测试从NULL列表返回的文字NULL的类型,它会为您提供SELECT

答案 3 :(得分:2)

它存储在位图中,而不是列值。

示例:名为中间名

的可空varchar列
  • 第1行,“bob”存储为偏移量,3个字节用于bob,2个字节用于“bob”
  • 第2行,NULL行不存储为类似“bob”的值,而是存储在行标题

除非你有一个非常小的表,比如说一个列char(1),否则效率更高

Link 1 Link 2

答案 4 :(得分:0)

如果使用varchar或nvarchar数据类型,则该行使用的字节数较小。这就是为什么你可以创建一个表(但不应该),它具有比实际存储在记录中更多的潜在字节。

答案 5 :(得分:0)

在Oracle 11G中,我也有同样的情况。您无法释放(检查dba_segments)现有行占用的空间,方法是将列设置为NULL,无论其位置如何,位于中间或末尾。

UPDATE AUCORE_QA.SYSTEM_AUDIT_LOGS SET KEY=NULL;
SELECT OWNER, TABLESPACE_NAME , SEGMENT_NAME,SEGMENT_TYPE,BYTES/1024/1024 MB
FROM DBA_SEGMENTS 
WHERE OWNER LIKE 'AUCORE_QA' AND SEGMENT_TYPE='TABLE' AND SEGMENT_NAME like '%AUDIT_LOG%'
ORDER BY BYTES DESC;

但是,我将列设为'Nullable',并且能够看到后续插入行的节省。

ALTER TABLE SYSTEM_AUDIT_LOGS MODIFY KEY NULL;
相关问题