PostgreSQL TPROC-C基準測試:PostgreSQL 12與PostgreSQL 13效能對比

jaymarco發表於2020-12-08

postgresql13.0剛剛釋出,並在各個方面進行了許多效能改進。為了瞭解這些變化帶來了的差異,我使用HammerDB對不同數量的虛擬使用者執行了許多基準測試,比較了未調整配置和“啟動程式”調整配置的PostgreSQL 12.4和13.0,即我們建議使用者將其用作自己的部署的起點。

  • 伺服器規格

被測伺服器( SUT )是執行 Red Hat Enterprise Linux 版本 8.2 Ootpa )的 Amazon AWS m5.metal 例項

  PostgreSQL 資料目錄位於 RAID 10 中配置的八個磁碟上。檔案系統為 xfs ,預讀設定為 8192 。、

PostgreSQL WAL目錄位於其自己的磁碟上。檔案系統為 xfs,預讀設定為 8192

  • PostgreSQL

這些測試在社群軟體包中的 PostgreSQL 12.4PostgreSQL 13.0上執行。每個伺服器的測試大多未經調整。

  • 未調整 設定

所有其他設定保持預設值。

  • 調整設定

所有其他設定保持預設值。

  • HammerDB

使用的測試驅動程式是 HammerDB,對資料模型進行了一些修改,以使用適當的 PostgreSQL 資料型別,最佳化列順序進行對齊,並刪除填充因子設定(有關使用的確切模式,請參見本文結尾處的 資料模型 部分) )。這些修改符合 TPC-C 規範:

第1.3節—表格佈局

對於每個表,可以使用從測試系統獲得的任何物理表示形式,以任何順序實現以下屬性列表。

HammerDB 使用的演算法未做任何更改。

HammerDB 使用 2000 個倉庫填充該資料庫。每個表都透過其主鍵索引進行聚類(歷史記錄中沒有索引)。 ANALYZE VACUUM FREEZE 在所有表上執行。保留此原始資料庫的基本備份。

  • 方法

對於每個虛擬使用者數,都會從基本備份中還原一個新資料庫。然後以5 分鐘的加速時間和1 小時的測試時間執行HammerDB  

請注意,思考和關鍵時間已禁用,因為此測試的目的是檢視最大可能的效能。這不能反映實際的工作量,也不適合執行按本就算TPC-C 基準測試。
注意:對於正確的TPC-C 基準測試,測試必須執行至少兩個小時。

  • 結果

下表顯示了開箱即用和正確調整的 12.4 13.0 的結果。值表示每分鐘的交易量。

  從該圖表中我們可以看到, 12.4 13.0 的未調整效能基本相同,其中 13.0 具有優勢,並且效能在 50 75 個虛擬使用者數之間最大化。

如果進行適當的調整,我們每分鐘的事務數量最多可以達到8倍,並隨著虛擬使用者數量的增加而維持下去。

在未調整和調整的13.0之間可以看到相同的結果。

如果將經過適當調整的12.4和13.0進行比較,則可以看到250個虛擬使用者數每分鐘的事務處理速度提高了近20%,然後慢慢回落到12.4的水平。

  • 概要

測試表明,正確調整PostgreSQL 伺服器具有巨大的好處。13.0 版的開箱即用效能比12.4 更好,並且在調整兩個伺服器時的差異甚至更大。PostgreSQL 13 代表了開源關聯式資料庫的又一次飛躍,因為它隨著每個新版本的釋出而不斷完善

  • 附錄 A :資料模型

CREATE TABLE customer (

    c_since timestamp with time zone NOT NULL,

    c_id integer NOT NULL,

    c_w_id integer NOT NULL,

    c_d_id smallint NOT NULL,

    c_payment_cnt smallint NOT NULL,

    c_delivery_cnt smallint NOT NULL,

    c_first character varying(16) NOT NULL,

    c_middle character(2) NOT NULL,

    c_last character varying(16) NOT NULL,

    c_street_1 character varying(20) NOT NULL,

    c_street_2 character varying(20) NOT NULL,

    c_city character varying(20) NOT NULL,

    c_state character(2) NOT NULL,

    c_zip character(9) NOT NULL,

    c_phone character(16) NOT NULL,

    c_credit character(2) NOT NULL,

    c_credit_lim numeric(12,2) NOT NULL,

    c_discount numeric(4,4) NOT NULL,

    c_balance numeric(12,2) NOT NULL,

    c_ytd_payment numeric(12,2) NOT NULL,

    c_data character varying(500) NOT NULL,

    CONSTRAINT customer_i1 PRIMARY KEY (c_w_id, c_d_id, c_id)

);

CREATE UNIQUE INDEX customer_i2 ON customer USING btree (c_w_id, c_d_id, c_last, c_first, c_id);


CREATE TABLE district (

    d_w_id integer NOT NULL,

    d_next_o_id integer NOT NULL,

    d_id smallint NOT NULL,

    d_ytd numeric(12,2) NOT NULL,

    d_tax numeric(4,4) NOT NULL,

    d_name character varying(10) NOT NULL,

    d_street_1 character varying(20) NOT NULL,

    d_street_2 character varying(20) NOT NULL,

    d_city character varying(20) NOT NULL,

    d_state character(2) NOT NULL,

    d_zip character(9) NOT NULL,

    CONSTRAINT district_i1 PRIMARY KEY (d_w_id, d_id)

);


CREATE TABLE history (

    h_date timestamp with time zone NOT NULL,

    h_c_id integer,

    h_c_w_id integer NOT NULL,

    h_w_id integer NOT NULL,

    h_c_d_id smallint NOT NULL,

    h_d_id smallint NOT NULL,

    h_amount numeric(6,2) NOT NULL,

    h_data character varying(24) NOT NULL

);


CREATE TABLE item (

    i_id integer NOT NULL,

    i_im_id integer NOT NULL,

    i_name character varying(24) NOT NULL,

    i_price numeric(5,2) NOT NULL,

    i_data character varying(50) NOT NULL,

    CONSTRAINT item_i1 PRIMARY KEY (i_id)

);


CREATE TABLE new_order (

    no_w_id integer NOT NULL,

    no_o_id integer NOT NULL,

    no_d_id smallint NOT NULL,

    CONSTRAINT new_order_i1 PRIMARY KEY (no_w_id, no_d_id, no_o_id)

);


CREATE TABLE order_line (

    ol_delivery_d timestamp with time zone,

    ol_o_id integer NOT NULL,

    ol_w_id integer NOT NULL,

    ol_i_id integer NOT NULL,

    ol_supply_w_id integer NOT NULL,

    ol_d_id smallint NOT NULL,

    ol_number smallint NOT NULL,

    ol_quantity smallint NOT NULL,

    ol_amount numeric(6,2),

    ol_dist_info character(24),

    CONSTRAINT order_line_i1 PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number)

);


CREATE TABLE orders (

    o_entry_d timestamp with time zone NOT NULL,

    o_id integer NOT NULL,

    o_w_id integer NOT NULL,

    o_c_id integer NOT NULL,

    o_d_id smallint NOT NULL,

    o_carrier_id smallint,

    o_ol_cnt smallint NOT NULL,

    o_all_local smallint NOT NULL,

    CONSTRAINT orders_i1 PRIMARY KEY (o_w_id, o_d_id, o_id)

);

CREATE UNIQUE INDEX orders_i2 ON orders USING btree (o_w_id, o_d_id, o_c_id, o_id);


CREATE TABLE stock (

    s_i_id integer NOT NULL,

    s_w_id integer NOT NULL,

    s_ytd integer NOT NULL,

    s_quantity smallint NOT NULL,

    s_order_cnt smallint NOT NULL,

    s_remote_cnt smallint NOT NULL,

    s_dist_01 character(24) NOT NULL,

    s_dist_02 character(24) NOT NULL,

    s_dist_03 character(24) NOT NULL,

    s_dist_04 character(24) NOT NULL,

    s_dist_05 character(24) NOT NULL,

    s_dist_06 character(24) NOT NULL,

    s_dist_07 character(24) NOT NULL,

    s_dist_08 character(24) NOT NULL,

    s_dist_09 character(24) NOT NULL,

    s_dist_10 character(24) NOT NULL,

    s_data character varying(50) NOT NULL,

    CONSTRAINT stock_i1 PRIMARY KEY (s_w_id, s_i_id)

);


CREATE TABLE warehouse (

    w_id integer NOT NULL,

    w_name character varying(10) NOT NULL,

    w_street_1 character varying(20) NOT NULL,

    w_street_2 character varying(20) NOT NULL,

    w_city character varying(20) NOT NULL,

    w_state character(2) NOT NULL,

    w_zip character(9) NOT NULL,

    w_tax numeric(4,4) NOT NULL,

    w_ytd numeric(12,2) NOT NULL,

    CONSTRAINT warehouse_i1 PRIMARY KEY (w_id)

);


原文連結:https://www.enterprisedb.com/blog/postgresql-tproc-c-benchmarks-postgresql-12-vs-postgresql-13-performance

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2740412/,如需轉載,請註明出處,否則將追究法律責任。

相關文章