2016-06-27 102 views
2

我想提高数据库性能。在一个项目中,所有表从intbigint,我认为这不仅是关于存储的不错选择,因为int要求4 bytesbigint要求8 bytes;而且关于性能。 所以我在Python:基准测试:PostgreSQL上的bigint vs int

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)) 

创造了一个小桌子与10个百万条目,一个脚本这是我创造了我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,具有相同的数据量,对不对?

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

回答

8

在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中查找更多详细信息。

+0

嗨@klin,我得到了这个结果'76; 76; 22; 22';你介意澄清一下吗? –

+0

谢谢@klin! –

+0

@klin你似乎在许多地方使用“位”而不是“字节”这个词。 – YeB