假设PostgreSQL在64位服务器上运行,int4(32位)和int8(64位)列之间的性能差异是什么?手册指出int4比int8更有效,但如果底层服务器是64位,是否有实际的性能差异(就(1)cpu,(2)内存和(3)存储而言)?
答案 0 :(得分:4)
就(1)cpu,(2)内存和(3)存储
而言
直截了当地说:
64位是32位的两倍。
64位是32位的两倍。
64位是32位的两倍。
我记得wp-hackers中的一个帖子做了一些基准测试。创建一个表,填写一百万行。然后查找,添加,分组,连接等。我不记得具体细节,但使用int8比使用int4确实更慢。
test=# create table int4_test (id int primary key);
CREATE TABLE
test=# create table int8_test (id bigint primary key);
CREATE TABLE
test=# insert into int4_test select i from generate_series(1,1000000) i;
INSERT 0 1000000
test=# insert into int8_test select i from generate_series(1,1000000) i;
INSERT 0 1000000
test=# vacuum analyze;
VACUUM
test=# \timing on
Timing is on.
test=# select sum(i.id) from int4_test i natural join int4_test j where i.id % 19 = 0;
sum
-------------
26315710524
(1 row)
Time: 1364.925 ms
test=# select sum(i.id) from int4_test i natural join int4_test j where i.id % 19 = 0;
sum
-------------
26315710524
(1 row)
Time: 1286.810 ms
test=# select sum(i.id) from int8_test i natural join int8_test j where i.id % 19 = 0;
sum
-------------
26315710524
(1 row)
Time: 1610.638 ms
test=# select sum(i.id) from int8_test i natural join int8_test j where i.id % 19 = 0;
sum
-------------
26315710524
(1 row)
Time: 1554.066 ms
test=# select count(*) from int4_test i natural join int4_test j where i.id % 19 = 0;
count
-------
52631
(1 row)
Time: 1244.654 ms
test=# select count(*) from int4_test i natural join int4_test j where i.id % 19 = 0;
count
-------
52631
(1 row)
Time: 1247.114 ms
test=# select count(*) from int8_test i natural join int8_test j where i.id % 19 = 0;
count
-------
52631
(1 row)
Time: 1541.751 ms
test=# select count(*) from int8_test i natural join int8_test j where i.id % 19 = 0;
count
-------
52631
(1 row)
Time: 1519.986 ms
答案 1 :(得分:2)
在存储和内存方面,答案显而易见:INT8是INT4的两倍,因此它使用两倍的存储空间和两倍的内存。
就计算(CPU)性能而言,我怀疑它在64位机器上完全没有区别,在某些情况下,INT4在32位机器上可能更有效。虽然除非你在这些INT上进行复杂的数学运算(而不仅仅是将它们用作序列等),但计算差异可能为零,或者几乎为零。
一旦你开始用你的INT做复杂的事情,它就不再是一个真正的数据库性能问题了。