在 Oracle 表中分配空間方面哪個更好:NUMBER 或 BINARY_FLOAT?
我有一個 100 億條記錄的表,所以我需要改進空間分配。我的表只有浮點類型(單精度)的欄位。什麼是最好的選擇,
NUMBER
或者BINARY_FLOAT
別的什麼?
這取決於您的數據(假設您不關心兩種數據類型的不同行為)。您可以使用與您實際儲存的數據相似的樣本數據進行測試,以找出哪種方法會使用更少的空間。
我將創建一個
num_test
包含兩個不同列的表,一個聲明為 a ,一個聲明為number
abinary_float
。create table num_test ( num_col number, flt_col binary_float );
如果我以 0.001 的增量填充 100,000 行數據
begin for i in 1 .. 100000 loop insert into num_test( num_col, flt_col ) values( i/1000, i/1000 ); end loop; end;
然後我可以看到儲存值所需的最小、最大和平均大小
select min( vsize(num_col) ), max( vsize(num_col) ), avg( vsize(num_col) ), min( vsize(flt_col) ), max( vsize(flt_col) ), avg( vsize(flt_col) ) from num_test;
如果你執行它,你會看到數字列平均為 3.89 字節/行(最小值為 2,最大值為 4),而每個
binary_float
需要 4 個字節的儲存空間。number
因此,在這種情況下使用可以節省少量費用。但這就是故事的全部嗎?沒有。如果我們使用不同的樣本數據,我們會得到非常不同的結果。讓我們執行相同的測試,但將所有內容除以 3
begin for i in 1 .. 100000 loop insert into num_test( num_col, flt_col ) values( i/1000/3, i/1000/3 ); end loop; end;
現在,如果您執行相同的
vsize
查詢,您將看到該number
列最多佔用 21 個字節的儲存空間,並且 200,000 行平均佔用 7.69 個字節。每行flt_col
仍然使用固定的 4 個字節。根據您的數據,您可能會發現一種或另一種方法會佔用更多空間。當然,在空間使用率存在顯著差異的情況下,當您使用浮點數時,可能會出現更嚴重的捨入問題。
另請注意,結果可能取決於版本。我在 11.2 數據庫上進行了測試,文件表明它
binary_float
總是佔用 4 個字節的儲存空間。在 10.2 中,文件指出binary_float
由於包含了額外的長度指示符而佔用了 5 個字節。對我來說,為什麼 32 位值需要一個長度字節並不明顯,所以我很難理解為什麼早期版本的 Oracle 可能需要第五個字節,但文件與它是一致的。