如果列为null,是否会影响列使用的空间? 使用的空间是否由列定义固定? 这是因数据库而异。 (我主要对SQL Server 2000感兴趣。)
澄清: 这个问题与该专栏“可空”时会发生什么有关(这与Kritsen& gbn所指出的另一点相关)。问题是,当列实际为空(在某个特定行中)时是否存在任何保存。
...
Cadaeic提供了SQL Server的答案,在2008版本之前似乎没有节省SQL Server,而根据Quassnoi,如果空列结束,您可以节省Oracle。谢谢你的答案,他们都很有帮助。
答案 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列除非你有一个非常小的表,比如说一个列char(1),否则效率更高
答案 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;