基准:PostgreSQL上的bigint vs int

Val*_*lva 9 postgresql int performance bigint sqldatatypes

我想提高我的数据库性能.在项目中,所有表从去intbigint,我认为这是一个不错的选择,不仅对于存储,因为int需要4 bytesbigint要求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))
Run Code Online (Sandbox Code Playgroud)

这就是我创建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)
);
Run Code Online (Sandbox Code Playgroud)

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

select * from description_bigint; -- 11m55s
select * from description_int; -- 11m55s
Run Code Online (Sandbox Code Playgroud)

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

我知道这不仅仅会对我的数据库的性能产生巨大影响,但我希望确保我们使用最佳实践并专注于此处的性能.

kli*_*lin 14

在64系统中,两个表几乎相同.列description_iddescription_int盖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;
Run Code Online (Sandbox Code Playgroud)

两个表的平均行大小几乎相同.这是因为整数列占用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)
);
Run Code Online (Sandbox Code Playgroud)

平均行大小应保持不变.

在PostgreSQL中查找计算和保存空间的更多细节.