テストテーブルの作成、1億件のレコードを作る。

PostgreSQL9.2で1億件のレコードを
取り扱うのにどの程度の性能が得られるのか実験した。

通常の業務システムで、単独テーブルのレコード数が
1億レコードのデータを扱うことはまず無いでしょう。

適切な括りで分割するなりしてレスポンスを確保すると思うが、
1億レコードが一般的なパソコンで、そこそこ動くことに驚いた。

全件のレコード取得が遅いのであって、
通常のインデックスを使用したwhere抽出は、問題なく働く。


動作環境
WinXP Pro Core2Duo E7500@2.93GHz、メモリ2GB
PostgreSQL9.2

>テーブル作成
CREATE TABLE hugeTable1
(uniqueID character varying(255) NOT NULL,
 key1 INTEGER, key2 INTEGER, key3 INTEGER,
 key4 INTEGER, key5 INTEGER, key6 INTEGER,
 key7 INTEGER, key8 INTEGER);

>レコードの作成 約13分掛かりました
INSERT INTO hugeTable1
 SELECT '2012121211987600' ||
 to_char(S1.seed * 10000000 + S2.seed * 1000000 + S3.seed * 100000 +
 S4.seed * 10000 + S5.seed * 1000 + S6.seed * 100 + S7.seed * 10 + S8.seed,'FM00000000'),
 S1.seed, S2.seed, S3.seed, S4.seed, S5.seed, S6.seed, S7.seed, S8.seed
 FROM
 seeds AS S1, seeds AS S2, seeds AS S3,
 seeds AS S4, seeds AS S5, seeds AS S6, seeds AS S7, seeds AS S8 ;

クエリーは、成功しました:  100000000 行の影響があり, 実行時間は、756766 ミリ秒でした。

>件数の確認
SELECT count(*) FROM hugeTable;
count=100000000

1回目の応答時間、約242秒
2回目以降の応答時間、90秒程度

シーケンススキャンで動作している。
"Aggregate  (cost=2386364.40..2386364.41 rows=1 width=0)"
"  ->  Seq Scan on hugetable1  (cost=0.00..2136364.32 rows=100000032 width=0)"

>プライマリーキーを作成。1755秒掛かりました。
ALTER TABLE hugeTable1 ADD PRIMARY KEY(uniqueID);

NOTICE:  ALTER TABLE / ADD PRIMARY KEYはテーブル"hugetable1"に暗黙的なインデックス"hugetable1_pkey"を作成します
クエリーは、1755656 ミリ秒で結果なしでうまく帰りました

>プライマリーキー作成後の件数確認
select count(*) from hugeTable1;

1回目の応答時間、80438 ms.
2回目以降の応答時間、84141 ms.

プライマリーキー作成後もシーケンススキャン
"Aggregate  (cost=2386364.00..2386364.01 rows=1 width=0)"
"  ->  Seq Scan on hugetable1  (cost=0.00..2136364.00 rows=100000000 width=0)"

postgresql.confを設定しIndexOnlyScanを試した。

シーケンススキャンの80秒に対し、5倍以上時間が掛かり438秒になった。

> クエリの実行:
select count(*) from hugeTable1;
クエリ全体 実行時間:438250 ms.
1 行検索しました

"Aggregate  (cost=5315086.10..5315086.11 rows=1 width=0)"
"  ->  Index Only Scan using hugetable1_pkey on hugetable1  (cost=0.00..5065086.10 rows=100000000 width=0)"


>テーブルとインデックスのサイズを確認
select pg_relation_size('hugetable1');

クエリ全体 実行時間:31 ms.
1 行検索しました
9309093888
テーブルのサイズ 約9.3GB


select pg_relation_size('hugetable1_pkey');
クエリ全体 実行時間:16 ms.
1 行検索しました
4973518848
インデックスのサイズ 約4.97GB