0

ubuntu 12.04で大規模なpostgres 9.1データベースを構築しています.1つのテーブルには約8,000万行程度が含まれています。SELECT ステートメントを実行するたびに:

SELECT * FROM db WHERE ID=1;

数千行しか返さないクエリを実行するには、約 2.5 分かかります。ディスク I/O でいくつかの診断を実行した後、それは問題ではないと思いますが、念のため以下に診断の出力を示します。(私は2GBのRAMを持っています)ここで何が良い出力なのか正確にはわかりませんが、インターネット上の他のサーバーで見つかった統計を考えると、大まかな結果のようです.

time sh -c "dd if=/dev/zero of=bigfile bs=8k count=500000 && sync"


500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 106.969 s, 38.3 MB/s

real    1m49.091s
user    0m0.248s
sys     0m9.369s

postgresql.conf を大幅に変更し、effective_cache を RAM の 75% に、shared_buffers を 25% に、checkpoint_segments を 15 に、work_mem を 256MB に、autovacuum、カーネルの SHMMAX などを増やしました。パフォーマンスはいくらか向上しましたが、それ以上ではありませんでした。 5% 向上。ローカルホストで実行してもまだ長い時間がかかるため、ネットワークは問題になりません。さらにデータを追加することを計画していますが、クエリ時間は行数とともに急速に増加しているようです。

これらの SELECT ステートメントを数分ではなく、数秒で実行できるはずです。このボトルネックがどこにある可能性があるかについて何か提案はありますか?

4

1 に答える 1

1

これが許しがたいほど明らかである場合は申し訳ありませんが、ID列にインデックスはありますか?

また、ディスクのせいではありませんが、シーケンシャル帯域幅をテストしただけなので、レイテンシについてはほとんどわかりません。38 MB/秒は、その測定値でも圧倒されると言わざるを得ませんが...

于 2012-11-25T18:00:24.930 に答える