1

このドキュメントからhttp://www.postgresql.org/docs/current/static/explicit-locking.html

PostgreSQL には、テーブル内のデータへの同時アクセスを制御するためのさまざまなロック モードが用意されていることは知っていました。

私の問題は、多くのセッションが自分の DB にアクセスすることですが、40 列の大きなテーブルを 1 つ作成するか、列が少ない (1 対 1 の関係) 多数のテーブルを作成するかを混乱させます。

  1. データを選択するときにすべてを選択するため ---> INNER JOIN を使用して多くのテーブルから選択すると時間がかかりますが、1 つの大きなテーブルから選択する方が時間がかかりません。したがって、多くのテーブルを使用している場合、php の応答が遅くなります。

  2. しかし、多くのセッションがテーブル内のデータを更新している間にテーブルを 1 つだけ使用すると、コマンド UPDATE、DELETE、および INSERT がターゲット テーブルで ROW EXCLUSIVE ロック モードを取得するため、デッドロックや遅延が発生するのではないかと心配します。一般に、このロック モードは、テーブル内のデータを変更するコマンドによって取得されます。

誰かが私が行うべき最善のアプローチを提案できますか? 1 つの大きなテーブルですか、それとも複数のテーブルですか。

4

1 に答える 1

8

INSERTUPDATEまたは更新するテーブルのロックをDELETE取得する必要があるのは事実です。ROW EXCLUSIVE

SELECTただし、このロックは正常な動作を妨げるものではありません。ロックSELECTのみが必要です。ACCESS SHAREこのロックは と互換性があります。つまり、明示的なロックを取得しない限り、 、またはによって他のデータが更新されている間でROW EXCLUSIVEも完全に実行できます。SELECTINSERTUPDATEDELETE

つまり、2 番目のアプローチを使用してもデッドロックが発生することはありません (使用しないSELECT FOR UPDATEでください。問題はありません)。

詳細については、PostgreSQL のドキュメントを参照してください。

于 2013-04-09T05:35:49.907 に答える