2016-07-07 16 views
0

我有一個非常適中的服務器,但是有相當多的數據(+ 50GB)。Postgres:將varchar主鍵映射到int id以獲得更好的性能

我收集產品的每日價格並將其存儲。由於我使用外部系統,產品和商店的ID都是變化的。

的表如今是這樣的:

products (about 10k rows) 
------------ 
id varchar 
other data.. 

shops (about 3k rows) 
------------ 
id varchar 
other data.. 

prices (more than 100 million rows!!) 
------------------------------- 
id_price serial (autoincrement) 
id_product varchar 
id_shop varchar 
date 

硬表要處理的是prices,消耗數據庫的50%左右,再加上其他40%的指標(幾乎90%的整個數據庫!)

varchar ids通常每個約10個字符,用utf8編碼,儘管它們都是ascii字符。


我的問題是是否值得改變VARCHAR ID來數值ID,以允許1)減小表的大小和查詢的2)加速(特別是掃描和加入,也許感謝較少的頁面從磁盤讀取?)

我在考慮將自動增量鍵添加到productsshops表,然後更改prices表指向新的價值。請注意,這個過程對於我的服務器來說非常重要,這就是我無法自己測試的原因。

回答

0

10位數字需要存儲爲big integer。根據什麼是最大的,中varchar大小不一的存儲減少可大了:

select 
    pg_column_size('9223372036854775807'::varchar(18)) as varchar18, 
    pg_column_size(''::varchar(18)) as empty_varchar18, 
    pg_column_size('9223372036'::varchar(12)) as varchar12, 
    pg_column_size(9223372036854775807) as bigint 
; 
varchar18 | empty_varchar18 | varchar12 | bigint 
-----------+-----------------+-----------+-------- 
     22 |    4 |  14 |  8 

較小的表和索引會對性能產生積極的影響。

相關問題