2009-02-17 60 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;