postgresql中的Bigint是8個字節的整數。它是uint64的一半範圍(因爲一位用於簽名整數)Postgres:數據類型 - 如何在postresql中存儲uint64
我需要對列進行大量聚合,並且我覺得NUMERIC類型的聚合比較慢整數類型。
在這種情況下,我應該如何優化存儲空間?
postgresql中的Bigint是8個字節的整數。它是uint64的一半範圍(因爲一位用於簽名整數)Postgres:數據類型 - 如何在postresql中存儲uint64
我需要對列進行大量聚合,並且我覺得NUMERIC類型的聚合比較慢整數類型。
在這種情況下,我應該如何優化存儲空間?
除非您有具體的理由,否則請使用NUMERIC
。它是較慢,相當慢很多,但這可能不像你想象的那麼重要。
因爲PostgreSQL在SQL級別不支持無符號的64位整數,所以您沒有其他選擇。你可以添加一個新的數據類型作爲擴展模塊,但它會很多工作。
您可以將無符號的64位int逐位移入64位有符號整數,因此maxuint64/2以上的值爲負值。但是這對於聚合來說是完全破壞的,而且通常會非常醜陋。
sum()
將返回numeric
如果輸入的是bigint
,所以它不會溢出
select sum(a)
from (values (9223372036854775807::bigint), (9223372036854775807)) s(a)
;
sum
----------------------
18446744073709551614
http://www.postgresql.org/docs/current/static/functions-aggregate.html
你確定你的操作會溢出一個符號的64位計數器?你爲什麼認爲它不會溢出一個無符號的64位計數器? –