1. 程式人生 > 其它 >大物件匯出效能測試

大物件匯出效能測試

對於大物件,如果資料是外部儲存的,在custom 方式匯出時,你會發現匯出效率非常低。本文測試各種匯出場景,驗證各種情況下的匯出效率。

為保證測試結果可比性,本測試三個場景測試資料量都一樣(3.2G),只是單行大小的差異。

一、Inline 儲存的匯出效率

inline 儲存表示行記憶體儲,其行大小不能超過一頁,匯出效能與非大物件表沒區別。例子如下:

create table t_clob(id integer,content clob);
alter table t_clob alter column content set storage main;

--沒條記錄 32*32 = 1k insert into t_clob select generate_series(1,3200000),
(select array_to_string(array(select crypt(substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' FROM (ceil(random()*62))::int FOR 1),gen_salt('md5')) FROM generate_series(1, 32)), ''))

匯出效能如下:

[c5@dbhost03 temp]$ date
Sat Dec 18 15:55:39 CST 2021
[c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp -t t_clob -d test -U system 
[c5@dbhost03 temp]$ date
Sat Dec 18 15:56:19 CST 2021

[c5@dbhost03 temp]$ date
Sat Dec 18 15:53:57 CST 2021
[c5@dbhost03 temp]$ sys_dump -Fc -f 1.dmp -t t_clob -d test -U system 
[c5@dbhost03 temp]$ date
Sat Dec 18 15:54:37 CST 2021

對於行記憶體儲,無論custom ,還是 plain,匯出速度沒有區別。

二、行外儲存:CLOB型別資料匯出

1、構造資料

create table t_clob(id integer,content clob);

--儘量保證資料隨機。每條記錄 32 * 1024 = 32K
insert into t_clob select generate_series(1,100000),
(select array_to_string(array(select crypt(substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' FROM (ceil(random()*62))::int FOR 1),gen_salt('md5')) FROM generate_series(1, 1024)), '')) test=# \d+ t_clob Table "public.t_clob" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+----------+--------------+------------- id | integer | | | | plain | | content | clob | | | | extended | | Access method: heap

extended:表示external , compressed

2、非壓縮匯出速度測試

--用時 33 秒
[c5@dbhost03 temp]$ date Sat Dec 18 10:54:26 CST 2021 [c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp -t t_clob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 10:54:59 CST 2021 [c5@dbhost03 temp]$ ls -l total 4194240 -rw-rw-r-- 1 c5 c5 3482289796 Dec 18 10:54 1.dmp --用時 45 秒 [c5@dbhost03 temp]$ date Sat Dec 18 10:56:11 CST 2021 [c5@dbhost03 temp]$ sys_dump -Ft -f 1.dmp -t t_clob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 10:56:56 CST 2021 [c5@dbhost03 temp]$ ls -l total 4194240 -rw-rw-r-- 1 c5 c5 3482295296 Dec 18 10:56 1.dmp --用時 251 秒 [c5@dbhost03 temp]$ date Sat Dec 18 11:03:07 CST 2021 [c5@dbhost03 temp]$ sys_dump -Fc -f 1.dmp -t t_clob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 11:07:18 CST 2021 [c5@dbhost03 temp]$ ls -l total 2474068 -rw-rw-r-- 1 c5 c5 2533441731 Dec 18 11:07 1.dmp

結論:plain 匯出速度最快,10W條資料,用時33秒;custom 方式匯出最慢,10W條資料,用時4分11秒,但佔用空間最小,採用了壓縮匯出。

3、壓縮方式匯出

直接匯出壓縮格式:用時175秒

[c5@dbhost03 temp]$ date
Sat Dec 18 11:09:36 CST 2021
[c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp -t t_clob -d test -U system -Z 1
[c5@dbhost03 temp]$ date
Sat Dec 18 11:12:31 CST 2021
[c5@dbhost03 temp]$ ls -l
total 2544552
-rw-rw-r-- 1 c5 c5 2605617264 Dec 18 11:12 1.dmp

用管道方式,邊導邊壓縮:用時126秒

[c5@dbhost03 temp]$ mknod 1.dmp.p p

[c5@dbhost03 temp]$ date Sat Dec 18 11:56:54 CST 2021 [c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp.p -t t_clob -d test -U system & [1] 36191 [c5@dbhost03 temp]$ compress < 1.dmp.p > 1.dmp.Z date [1]+ Done sys_dump -Fp -f 1.dmp.p -t t_clob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 11:59:00 CST 2021 [c5@dbhost03 temp]$ ls -l total 1762932 -rw-rw-r-- 1 c5 c5 1805240015 Dec 18 11:59 1.dmp.Z

三、行外儲存:BLOB 型別資料匯出

1、準備資料

create table t_blob(id integer,content blob);

insert into t_blob select generate_series(1,100000),blob_import('/data/c5/temp/1.txt.tar');

2、非壓縮匯出

--用時 73 秒
[c5@dbhost03 temp]$ date Sat Dec 18 14:21:16 CST 2021 [c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp -t t_blob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 14:22:29 CST 2021 [c5@dbhost03 temp]$ ls -l 1.dmp -rw-rw-r-- 1 c5 c5 7346689796 Dec 18 14:22 1.dmp --用時 96 秒 [c5@dbhost03 temp]$ date Sat Dec 18 14:23:42 CST 2021 [c5@dbhost03 temp]$ sys_dump -Ft -f 1.dmp -t t_blob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 14:25:18 CST 2021 [c5@dbhost03 temp]$ ls -l 1.dmp -rw-rw-r-- 1 c5 c5 7346695168 Dec 18 14:25 1.dmp --用時 93 秒 [c5@dbhost03 temp]$ date Sat Dec 18 14:29:46 CST 2021 [c5@dbhost03 temp]$ sys_dump -Fc -f 1.dmp -t t_blob -d test -U system [c5@dbhost03 temp]$ date Sat Dec 18 14:31:19 CST 2021 [c5@dbhost03 temp]$ ls -l total 423636 -rw-rw-r-- 1 c5 c5 433723954 Dec 18 14:31 1.dmp

結論: plain 方式最快,但最佔用空間;因為資料都是重複的,用custom 方式壓縮比非常高,匯出結果檔案也比較小,整個速度也比較快。

3、壓縮方式匯出

直接匯出壓縮:用時88秒

[c5@dbhost03 temp]$ date
Sat Dec 18 14:51:44 CST 2021
[c5@dbhost03 temp]$ sys_dump -Fp -f 1.dmp -t t_blob -d test -U system -Z 1
[c5@dbhost03 temp]$ date
Sat Dec 18 14:53:12 CST 2021
[c5@dbhost03 temp]$ ls -l
total 524300
-rw-rw-r-- 1 c5 c5 500398983 Dec 18 14:53 1.dmp

四、匯出測試結論

  • 用plain 匯出的檔案的大小是實際資料的大小,一般會大於資料庫實際佔用的空間,這是因為預設的extended 儲存是經過壓縮的。
  • 用plain 方式匯出並不慢,慢的是用custom方式匯出(External 儲存方式慢,inline 方式並不慢)。
  • custom 匯出實際是壓縮的,因此,如果資料的壓縮比較高,會因為寫IO更小,而帶來效能提升。如以上BLOB 測試結果
  • plain 匯出時,compress 選項可能會帶來很大效能損耗,實際要看壓縮比情況,如果壓縮比高,壓縮減少的IO會抵消CPU帶來的消耗。CLOB測試結果 1級壓縮情況下,所耗時是非壓縮情況下的 5倍;而BLOB 測試部分,由於資料都是相同的,壓縮比高,實際時間消耗與 plain 相差不多。
  • 如果要使用壓縮,建議採用管道方式,邊導邊壓縮。
KINGBASE研究院