64位服务器上PostgreSQL中int4和int8的性能差异

时间:2011-07-09 05:52:04

标签: performance postgresql integer

假设PostgreSQL在64位服务器上运行,int4(32位)和int8(64位)列之间的性能差异是什么?手册指出int4比int8更有效,但如果底层服务器是64位,是否有实际的性能差异(就(1)cpu,(2)内存和(3)存储而言)?

2 个答案:

答案 0 :(得分:4)

  

就(1)cpu,(2)内存和(3)存储

而言

直截了当地说:

  1. 64位是32位的两倍。

  2. 64位是32位的两倍。

  3. 64位是32位的两倍。

  4. 我记得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做复杂的事情,它就不再是一个真正的数据库性能问题了。