web-dev-qa-db-ja.com

SELECT文がPostgresのキャッシュバッファをダーティにするのはなぜですか?

Postgres 9.3サーバーでEXPLAIN (ANALYZE, BUFFERS) SELECT ...を実行しています。 Buffers: shared hit=166416 dirtied=2を出力します。
ドキュメントから 、「ダーティ」は以下を示します:

ダーティになったブロックの数は、このクエリによって変更された、以前に変更されていないブロックの数を示します。書き込まれたブロックの数は、クエリ処理中にこのバックエンドによってキャッシュから削除された、以前にダーティになったブロックの数を示します。

これは、ブロックをダーティとマークするプロセスは、データを更新するときにのみ発生するように思えます。私のクエリはSELECTですが、データを読み取るだけです。私はそれがヒットまたはリードのみを報告するだろうと想像します。私は明らかに間違っています。しかし、この状況で正確には何が起こっていますか?

7
D-Rock

これには単純な理由があります。

PostgreSQLでは、行は可視性チェックを通過する必要があります。最初の読み取り時に、システムはすべての人が行を表示できるかどうかを確認します。もしそうなら、それは「冷凍」されます。これが書き込みの元です。同様に、VACUUMもビットを設定します。

詳細な説明があります: http://www.cybertec.at/speeding-up-things-with-hint-bits/

10