2016-06-27 71 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