Oracle

為什麼 Oracle 的數字數據類型如此龐大?為什麼我似乎別無選擇?

  • March 27, 2017

Oracle 有一個最喜歡的數字類,稱為NUMBER. 這是一個 22 字節的值,在索引中看起來很可笑。我有一些值很容易適合 6 字節整數,因此適合 64 位長的漂亮本機數據類型。然而,oracle 一直讓我的數字長 22 個字節。

我唯一能看到的地方是如果我把值放在一個索引中,並且那裡告訴我這個值是一個 22 字節的數字。

我知道有沒有捨入錯誤的數字很好,我可以理解,但我只想要一個可以用作另一個表的 ForeignKey 的整數,並且舍入不會成為問題。

Mysql、Postgres、MSSQL 都有讓我指定數據大小的變體(通過某種機制)。Oracle 希望將幾乎所有其他數字類型映射回NUMBER(size, precision),但無論我使用什麼值來表示大小或精度,oracle 都堅持該數字在我的索引中佔用 22 個字節。這比我需要的時間長了近 3 倍,並且有效地削減了我的 btree 的 M。

Oracle 確實有BINARY_FLOATand BINARY_DOUBLE,它甚至有 aROWID一點也不像整數。

甲骨文有什麼秘訣可以讓NUMBER超級高效嗎?某處是否有顯示映射到本機數據類型的數據類型的秘密文件?

但是 oracle 不斷使我的數字長 22 個字節

這個假設是錯誤的。儲存在NUMBER列中的值只佔用所需的空間。

從手冊中引用

NUMBER 值需要1 到22字節

(強調我的)

這可以使用以下VSIZE()函式進行驗證:

create table foo (id number(22), some_value number(22,8));

insert into foo values (1,  1.1);
insert into foo values (9999999999, 99999.123);
insert into foo values (9999999999999999, 9999999999999.6789);

select id, vsize(id), some_value, vsize(some_value) 
from foo;

將返回:

ID               | VSIZE(ID) | SOME_VALUE       | VSIZE(SOME_VALUE)
-----------------+-----------+------------------+------------------
              1 |         2 |              1.1 |                 3
     9999999999 |         6 |         99999.12 |                 6
9999999999999999 |         9 | 9999999999999.68 |                10

見這裡ixora

  • 數字具有可變長度,如字元串。
  • 每個數字佔用一個半字節(4位,半字節)
  • NUMBER 實施與平台無關
  • 您可以通過呼叫dump()函式來驗證列中數值的大小

PS:Oracle 也支持像 PLS_INTEGER 這樣的原生整數,但這些只能在 PL/SQL 上下文中使用。

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