【问题标题】:Benchmark: bigint vs int on PostgreSQL基准测试:PostgreSQL 上的 bigint 与 int
【发布时间】:2016-10-29 10:42:27
【问题描述】:

我想提高我的数据库性能。在一个项目中,所有表都从int 变为bigint,我认为这不仅在存储方面是一个糟糕的选择,因为int 需要4 bytes,而bigint 需要8 bytes;而且在性能方面. 因此,我创建了一个包含 1000 万 个条目的小表格,其中的脚本位于 Python:

import uuid

rows=10000000

output='insert_description_bigint.sql'
f = open(output, 'w')

set_schema="SET search_path = norma;\n"
f.write(set_schema)

for i in range(1,rows):
    random_string=uuid.uuid4()
    query="insert into description_bigint (description_id, description) values (%d, '%s'); \n"
    f.write(query % (i,random_string))

这就是我创建two 表的方式:

-- BIGINT

DROP TABLE IF EXISTS description_bigint;

CREATE TABLE description_bigint
(
  description_id BIGINT PRIMARY KEY NOT NULL,
  description VARCHAR(200),
  constraint description_id_positive CHECK (description_id >= 0)
);

select count(1) from description_bigint;
select * from description_bigint;
select * from description_bigint where description_id = 9999999;

-- INT

DROP TABLE IF EXISTS description_int;

CREATE TABLE description_int
(
  description_id INT PRIMARY KEY NOT NULL,
  description VARCHAR(200),
  constraint description_id_positive CHECK (description_id >= 0)
);

插入所有这些数据后,我对两个表进行查询,以测量它们之间的差异。令我惊讶的是,它们都具有相同的性能:

select * from description_bigint; -- 11m55s
select * from description_int; -- 11m55s

我的基准测试有问题吗? int 不应该比 bigint 快吗?特别是,当 primary key 定义为 index 时,这意味着为 bigint 创建索引将比为 int 创建索引,具有相同的数据量对吧?

我知道这不仅仅是一件小事,会对我的数据库的性能产生巨大影响,但我想确保我们使用最佳实践并在这里专注于性能。

【问题讨论】:

    标签: performance postgresql int sqldatatypes bigint


    【解决方案1】:

    在 64 系统中,这两个表几乎相同。 description_int 中的 description_id 列包含 8 个字节(4 个用于整数,4 个用于对齐)。试试这个测试:

    select 
        pg_relation_size('description_int')/10000000 as table_int, 
        pg_relation_size('description_bigint')/10000000 as table_bigint,
        pg_relation_size('description_int_pkey')/10000000 as index_int,
        pg_relation_size('description_bigint_pkey')/10000000 as index_bigint;
    

    两个表的平均行大小几乎相同。这是因为整数列占用 8 个字节(一个值 4 个字节,对齐 4 个字节)与 bigint(一个没有填充符的值 8 个字节)完全一样。这同样适用于索引条目。然而,这是一个特例。如果我们在第一个表中再添加一个整数列:

    CREATE TABLE two_integers
    (
      description_id INT PRIMARY KEY NOT NULL,
      one_more_int INT,
      description VARCHAR(200),
      constraint description_id_positive CHECK (description_id >= 0)
    );
    

    平均行大小应保持不变。

    Calculating and saving space in PostgreSQL 中查找更多详细信息。

    【讨论】:

    • 嗨@klin,我得到了这个结果76;76;22;22;你介意澄清一下吗?
    • @klin 您似乎在很多地方都在使用“bits”这个词而不是“bytes”。
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2014-09-16
    • 2023-03-29
    • 2017-04-26
    • 2011-04-25
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多