Calender
Sun Mon Tue Wed Thu Fri Sat
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< September 2018 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< 【Delphi】「最適化をおこなう」の恐怖 | main | 【WEB】無用のヘッダーの空白に注意 >>
【PostgreSQL】負荷テスト_1500万件
 一千万超のレコードがあるテーブルでOSSのPostgreS0Lのテストしてみました。テストケースとしてテーブル数35、総レコード数で約6300万行の参照系のみです、ベンチマークを行いたいだけなら、pgbenchがcontrib中にあるのでそれを利用できます
DBのファイルサイズは約21GByte
バックアップ
pg_dump -h xxx.xxx.xxx.xxx -p 5432 -U jojo -F c -b -v -f /tmp/db.backup" tedtdb

リストア
pg_restore -h xxx.xxx.xxx.xxx -p 5432 -U jojo -d testdb -v /tmp/db.backup
で出力したサイズは 約1GByte、バックアップ、リストアともネットワーク経由で1時間ほどでした。
--------------------------------------
distribution    : Plamo(GUIはなし)
Kernel          : 2.4.29
model name      : Intel(R) Pentium(R) 4 CPU 3.40GHz
cache size      : 1024 KB
bogomips        : 6763.31
HDD             : SATA2(hdparm -t = 56.14 MB/sec)
MemTotal        :1023244 kB
PostgreSQL      : 8.2.4
--------------------------------------
-- クエリーの実行:
select count(*) from "--TABLE--"
クエリー全体 実行時間:93938 ms.
1 行検索しました
結果:15278465

-- クエリーの実行:
select count(*) from "--TABLE--"
 where "日付" between  '2007/1/1' and '2007/1/30' 
    and "店" in ('05','15','25')
クエリー全体 実行時間:797 ms.
1 行検索しました
結果:67880

-- クエリーの実行:
select "店",count(*) from "--TABLE--"
 where "日付" between  '2007/1/1' and '2007/1/30' 
group by "店" 
クエリー全体 実行時間:104703 ms.
クエリー全体 実行時間:7656 ms.  (日付にインデックス)
36 行検索しました

※条件はキャッシュが効かないように都度変えています

--------------------------------------
distribution    : TurboLinux Server10
Kernel          : 2.6.8
model name      : Intel(R) Celeron(R) CPU 2.53GHz
cache size      : 256 KB
bogomips        : 4980.73
MemTotal        : 247596 kB
HDD             : SATA2(hdparm -t =  53.78 MB/sec)
PostgreSQL      : 8.2.4
--------------------------------------
-- クエリーの実行:
select count(*) from "--TABLE--"
クエリー全体 実行時間:390766 ms.(vacuum前)
クエリー全体 実行時間:126000 ms.(vacuum後)
1 行検索しました
結果:15278465

-- クエリーの実行:
select count(*) from "--TABLE--"
 where "日付" between  '2006/1/1' and '2006/2/28' 
    and "店" in ('05','15','25')
クエリー全体 実行時間:1829 ms.
1 行検索しました
結果:94400

-- クエリーの実行:
select "店",count(*) from "--TABLE--"
 where "日付" between  '2007/1/1' and '2007/1/30' 
group by "店" 
クエリー全体 実行時間:187313 ms.
クエリー全体 実行時間:10562  ms.("日付"にインデックス)
36 行検索しました

--------------------------------------
distribution    : Windows2000 pro
model name      : Pentium4  3.2GhHz2.53GHz
MemTotal        : 1 Gbyte
HDD             : SATA2
PostgreSQL      : 8.2
-------------------------------------
-- クエリーの実行:
select count(*) from "--TABLE--"
クエリー全体 実行時間:740484 ms.(vacuum前)
クエリー全体 実行時間:185703 ms.(vacuum後)
1 行検索しました
結果:15278465

-- クエリーの実行:
select count(*) from "--TABLE--"
 where "日付" between  '2007/1/1' and '2007/1/30' 
    and "店" in ('05','15','25')
クエリー全体 実行時間:1766 ms.
1 行検索しました
結果:67880

-- クエリーの実行:
select "店",count(*) from "--TABLE--"
 where "日付" between  '2007/1/1' and '2007/1/30' 
group by "店" 
クエリー全体 実行時間:165734 ms.
クエリー全体 実行時間: 11704 ms.("日付"にインデックス")
36 行検索しました
 色々ためしましたが、簡単なクエリであれば秒オーダーででした。
 それにPostgreSQL特有のCOPYコマンドはかなり高速です、テーブルにもよりますが、CSV 252,9014行(35ファイル)を3分かかっていませんでした。下手にINSERTを発行するよりもCSV経由で渡したほうが早いかも
 以前は敷居のたかかったWindowsへのインストールもインストーラで簡単にインストールできます。日本語の項目名も(pgAdmin靴念貮文字化け(フォントの問題)していますが)利用できます。
今回使ったDBのテーブル構成
TABLE名レコード数列数TABLE名レコード数列数
TABLE_0115,278,46537TABLE_203,9993
TABLE_0213,183,23846TABLE_213,08215
TABLE_0313,177,2648TABLE_223,08223
TABLE_047,219,53810TABLE_231,77843
TABLE_054,531,67032TABLE_241,6265
TABLE_063,728,19219TABLE_251,4003
TABLE_071,561,42811TABLE_261,2803
TABLE_081,328,91716TABLE_271,2003
TABLE_091,296,95539TABLE_286557
TABLE_101,073,480172TABLE_293204
TABLE_11154,199173TABLE_301044
TABLE_12147,73211TABLE_31147
TABLE_13103,4047TABLE_32043
TABLE_1495,0968TABLE_33010
TABLE_1583,9694TABLE_34023
TABLE_1636,59616TABLE_350172
TABLE_1719,126131


TABLE_1815,86624


TABLE_1910,060172 合 計63,063,735

↑ 全テーブルの count(*)をUNIONで結合したもの
クエリー全体 実行時間:286266 ms.

メモ:
全テーブルとの列数と行概算を出力SQL
select relname,reltuples::bigint,count(information_schema.columns.column_name)
from pg_class
right join information_schema.columns on pg_class.relname = information_schema.columns.table_name
where relnamespace=2200 and reltype <> 0 and information_schema.columns.table_schema='public'
group by relname,reltuples::bigint
order by reltuples desc

PostgreSQLユーザ会
PostgreSQLウォッチ
【PostgreSQL】負荷テスト_4千万/TBL
大量データを扱うデータベースを安価に実現
| サーバー関連 | 23:52 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/586999