2009-02-17 58 views
22

如果列为空使用空值,这是否会影响在列中使用的空间? 使用的空间是否被列定义所固定? 这是否因数据库而异? (我主要interestred在SQL Server 2000中)空间数据库

澄清: 问题涉及不列号为“可空”(此费用另位为Kritsen & GBN指出的)会发生什么。问题是,当列实际为空时(在某些特定行中)是否有任何保存?

...

Cadaeic提供这似乎是在SQL Server中没有积蓄,直到2008年版本的SQL Server的答案,而根据Quassnoi你可以节省甲骨文如果空列在最后。谢谢你的回答,他们都很有帮助。

回答

18

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

另一方面,可变长度数据只需要数据长度和开销来存储实际长度。例如,VARCHAR(n)将使用2个字节的数据来表示实际长度,因此所需的存储空间总是n + 2。

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

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

+2

如果零长度表示空字符串,那么SQL用于空字符串的是什么?他们是不一样的。 – Andy 2015-04-01 01:32:46

9

SQL Server有一个位表示NULL。但如果该列被定义为NOT NULL

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

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

编辑:请注意,有位字段允许NULL需要存储它的两位!我经常看到BIT字段没有被考虑,不需要存储NULL,但没有被设置为NOT NULL,所以有意无意地浪费了

2

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

示例:称为中间名

  • 行1可为空的varchar列,“鲍勃”被存储为偏移,3个字节用于鲍勃,2个字节用于“鲍勃”
  • 行2的长度, NULL行不存储为一个值,如“鲍勃”,但行头

除非你有一个非常小桌子,说一列CHAR(1),那么它的效率更高

Link 1 Link 2

3

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

如果NULL列是最后一行,那么它们根本不占用任何空间。 Oracle将每行的总行数加在前面,所有不适合的数据被认为是NULL

如果有一个NULL柱后一些非NULL数据,则NULL存储为0xFF一个字节(即,NULL类型)。

VARCHAR2相当于NULL。如果您测试从SELECT列表返回的文字NULL的类型,它会给你一个VARCHAR2(0)

0

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

0

在Oracle 11G中,我也有同样的情况。无论中间位置还是末尾位置,都无法通过设置列NULL来释放(检查dba_segments)占用现有行的空间。

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;