Oracle
為什麼 Oracle 的數字數據類型如此龐大?為什麼我似乎別無選擇?
Oracle 有一個最喜歡的數字類,稱為
NUMBER
. 這是一個 22 字節的值,在索引中看起來很可笑。我有一些值很容易適合 6 字節整數,因此適合 64 位長的漂亮本機數據類型。然而,oracle 一直讓我的數字長 22 個字節。我唯一能看到的地方是如果我把值放在一個索引中,並且那裡告訴我這個值是一個 22 字節的數字。
我知道有沒有捨入錯誤的數字很好,我可以理解,但我只想要一個可以用作另一個表的 ForeignKey 的整數,並且舍入不會成為問題。
Mysql、Postgres、MSSQL 都有讓我指定數據大小的變體(通過某種機制)。Oracle 希望將幾乎所有其他數字類型映射回
NUMBER(size, precision)
,但無論我使用什麼值來表示大小或精度,oracle 都堅持該數字在我的索引中佔用 22 個字節。這比我需要的時間長了近 3 倍,並且有效地削減了我的 btree 的 M。Oracle 確實有
BINARY_FLOAT
andBINARY_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 上下文中使用。