1

平均して約10個のUPDATEまたはINSERTステートメントを実行するPythonスクリプト(psycopg2を使用)から呼び出すストアド関数があります。iostat は、1 秒あたり 15,000 回の書き込みが頻繁に発生し、使用率が 100% であることを示しています。

iostat の数を減らすためにいくつか変更できることを願っています。関数をできるだけ早く実行する必要があるためです。

この状況でのトランザクションと関数に関する最善の戦略は何ですか? いつコミットを実行する必要がありますか?

このように保存した関数を呼び出すと、トランザクションが自動的に開始および終了することをどこかで読んだことを思い出します。すべての関数パラメーターをキューとして機能するテーブルに挿入し、そのテーブルを読み取ってその作業を行うように関数を変更するなど、何か他のことを行う方がよいでしょうか?

コメントのリンクからの出力、

version                      | PostgreSQL 9.1.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments          | 32
client_encoding              | UTF8
default_statistics_target    | 100
effective_cache_size         | 8GB
lc_collate                   | en_US.UTF-8
lc_ctype                     | en_US.UTF-8
log_destination              | stderr
log_rotation_age             | 1d
log_rotation_size            | 0
log_truncate_on_rotation     | on
logging_collector            | on
maintenance_work_mem         | 64MB
max_connections              | 30
max_stack_depth              | 2MB
port                         | 5432
server_encoding              | UTF8
shared_buffers               | 4GB
synchronous_commit           | off
temp_buffers                 | 128MB
TimeZone                     | US/Eastern
wal_buffers                  | 16MB
work_mem                     | 128MB
4

1 に答える 1

0

ディスク サブシステムを改善するための kgrittin の提案に加えて、トランザクションについて指摘したいと思います。トランザクションは WAL で fsync を強制するため、コミットが少ないほど強制される物理書き込みは少なくなります。一般に、トランザクションの論理的なグループ化はパフォーマンスよりも重要ですが、長いトランザクションは、相互に待機しなければ、多数の短いトランザクションよりも優れたパフォーマンスを発揮することを意味します。

于 2013-04-01T12:15:20.097 に答える