Postgres:将varchar主键映射到int ID以获得更好的性能

时间:2016-07-07 14:06:18

标签: database postgresql

我有一个非常适度的服务器,但有很多数据(+ 50GB)。

我从产品中收集每日价格并存储它们。由于我使用外部系统,产品和商店的ID是varchars。

现在的表格如下:

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 id通常大约10个字符,以utf8编码,尽管它们都是ascii字符。


我的问题是是否值得将varchar ID更改为数字ID以允许 1)减少表的大小和 2)查询的加速(特别是扫描和连接,可能是因为从磁盘读取的页面较少?)

我正在考虑向productsshops表添加自动增量密钥,然后更改prices表以指向新值。请注意,这个过程对我的服务器来说非常大,这就是为什么我自己无法测试它。

1 个答案:

答案 0 :(得分: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

较小的表和索引会对性能产生积极影响。