Oracle

在 Oracle 表中分配空間方面哪個更好:NUMBER 或 BINARY_FLOAT?

  • April 10, 2014

我有一個 100 億條記錄的表,所以我需要改進空間分配。我的表只有浮點類型(單精度)的欄位。什麼是最好的選擇,NUMBER或者BINARY_FLOAT別的什麼?

這取決於您的數據(假設您不關心兩種數據類型的不同行為)。您可以使用與您實際儲存的數據相似的樣本數據進行測試,以找出哪種方法會使用更少的空間。

我將創建一個num_test包含兩個不同列的表,一個聲明為 a ,一個聲明為numbera binary_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 可能需要第五個字節,但文件與它是一致的。

引用自:https://dba.stackexchange.com/questions/62881