2016-11-18 42 views
1

我在NUMERIC列中存儲加密貨幣交易餘額。由於加密貨幣值與傳統貨幣相比在某些極端範圍內有所不同,因此我使用NUMERIC(60,20)類型來捕獲所有用例。由於這感覺有點偏激,我很好奇PostgreSQL中具有高精度和精度的NUMERIC類型的性能

  • 有哪些表現(CPU)數字列的精度和規模越來越大的處罰

  • 什麼是數字列的精度和規模越來越大的存儲成本處罰

回答

2

一個NUMERIC列的申報規模和精確度作爲對您的插入值的約束,但他們不會直接影響存儲需求; 1::NUMERIC(1,0)1::NUMERIC(99,99)1::NUMERIC都具有相同的基本表示。考慮到這一點,您的最佳選擇可能是使用無約束的NUMERIC列,並將您的值轉換爲適用的比例/精度(按貨幣)。

NUMERIC值存儲爲基數爲10,000的數字的可變長度數組,每個數據由16位整數表示,因此存儲成本爲每4個十進制數字2個字節,併爲每個值加上6個字節的標題。小數部分和整數部分是分開存儲的,因此11消耗8個字節,而1.1需要10個字符。您可以使用例如一個給定值檢查存儲要求。 SELECT pg_column_size(1.1::NUMERIC)

至於CPU開銷,我預計大部分操作的成本會隨着數字的數量呈線性變化。然而,由於首先獲取價值的I/O成本,這通常是相形見絀的,所以這可能不是問題;你必須在你自己的硬件上嘗試你的查詢以確認。

+0

一個真正美麗的答案!謝謝。 –