« S2DaoとPostgreSQLのパーティショニングテーブル | Main | Teedaでログイン管理 »

2007.07.22

PostgreSQLのパーティショニングテーブル

 PostgreSQLのパーティショニングテーブルの処理速度を調べてみました。ただし、すごく簡単なテスト(ベンチマークテスト)となっていますので、これを一般化するのはちと危険かも(^^; 本当はスレッド数を変えたり、レコード数を増やしたり、データの生成処理を変えたり、別端末にするなど、いろいろとしなければならないのですが。

 測定環境は以下の通り。

1.Timestamp型で1ヶ月単位でテーブルを分割。とりあえずは2007年1月~12月の12個を作成。
2.ループで5万レコードを挿入。列および挿入データは以下の通り。

・serial型:nextvalで採番しながらデータを生成
・Timestamp型:このフィールドの内容でテーブルを分割。1月→12月の順で1レコードずつ挿入し、12月の次は1月に戻る。日は、各月の最大日の範囲内で乱数で設定。
・varchar(20):英数字を乱数で連結。文字数は10~20文字をやはり乱数で。
・int:1~20の番号を順番に。
・varchar(40):英数字を乱数で連結。文字数は30~40文字をやはり乱数で。
・int:1~Integer.MAX_VALUEの範囲の数値を乱数で。
・varchar(20):英数字を乱数で連結。文字数は10~20文字をやはり乱数で。
・int:1~Integer.MAX_VALUEの範囲の数値を乱数で。

3.パーティショニングを行っていない1テーブルの状態と、12個にパーティショニングを行った状態とで所要時間を比較。
4.ついでに検索処理もテスト。検索条件は年:2007年、月:1月→12月の順(12月の次は1月に戻る)、日:各月の最大日の範囲内で乱数で設定。各Select文でレコードの取得件数を取得(SELECT COUNT(*) FROM~)。検索処理も5万回ループし、所要時間を比較(検索対象フィールドにはインデックスをはっています)。

 結果は以下のような感じでした。それぞれ10回ずつ測定し、その平均値をとっています。なお、同一のPC上で測定しているため、DBのパフォーマンスに対していろいろな要因が影響している可能性は否定できませんので、参考値程度として考えてください。

・PostgreSQL8.2.4/Windows2000(SP4)
・SQLは(簡単なツールを)Java6環境下で実行

【非パーティショニング状態】
INSERT:1.92ms/Query
SELECT:1.56ms/Query

【パーティショニング状態】
INSERT:2.75ms/Query(+43%)
SELECT:1.44ms/Query(-7.6%)

 まぁ、想像通りというかなんというか、INSERTのパフォーマンスが低下していますね。おそらく、RULEに基づいて実際の保存先を振り分けるところのオーバーヘッドが影響しているのではないかと思います。逆にSELECTのパフォーマンスは若干向上しているようで、パーティショニングの効果が出ているような感じ?

 冒頭にも書いたように、DBを別端末にし、データ量やスレッド数をいろいろと変えて測定した時にどういう結果が得られるか興味のあるところではあります。

#まぁ、本来は5万レコード程度ではパーティショニングの対象外になるような気はします(^^; 100万件程度になると、SELECT処理の部分でもっと差が出てくるんではないでしょうか。

|

« S2DaoとPostgreSQLのパーティショニングテーブル | Main | Teedaでログイン管理 »

DB」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/15842592

Listed below are links to weblogs that reference PostgreSQLのパーティショニングテーブル:

« S2DaoとPostgreSQLのパーティショニングテーブル | Main | Teedaでログイン管理 »