web-dev-qa-db-ja.com

postgresでテーブルの変更が遅すぎる

新しい列を追加しようとしています

ALTER TABLE "Cidade" ADD COLUMN "BoundBox" VARCHAR(255)

この表に:

 "Cidade"
    "Id" integer not null
        constraint "Cidade_PK"
            primary key,
    "Nome" varchar(120),
    "EstadoId" integer not null
        constraint "Estado_Cidade_FK"
            references "Estado",
    "PontoCentralLatitude" numeric,
    "PontoCentralLongitude" numeric

しかし、クエリは決して終了しません。私はすでに5分間待っていましたが、何も起こりませんでした。テーブルには5,000レコードしかないので、テーブルへのアクセスがブロックされるので、あまり待つことはできません。私はテストデータベース(本番環境と同等)を持っていますが、それは非常に迅速に機能しました。 postgresのバージョンは9.5.6です。

5
Juliano Grams

PostgreSQL 9.6以降を実行している場合は、pg_blocking_pids()を使用して、クエリをロックするクエリのPIDを見つけることができます。

select pid, pg_blocking_pids(pid) as blocked_by, query as blocked_query
from pg_stat_activity
where pg_blocking_pids(pid)::text != '{}';
9
Eugenij

このステートメントは非常に高速ですが、テーブルにアクセス専用ロックが必要です。テーブルをロックしてブロックする長時間実行トランザクションが必要です。

使用 pg_stat_activity長いトランザクションを見つけるためのビュー。

4
Laurenz Albe

クエリとクエリの実行を非常に長時間ブロックするものがなく、このテーブルに多くのDELETEクエリがある場合は、テーブルをクリーンアップしてみてください。

VACUUM (VERBOSE, ANALYZE) table_name;
1
User Pro

あなたの説明によると、このテーブルはシステムで非常に使用されているようであり、あなたのalterステートメントは仕事をするためにテーブルのロックを取得するのに時間がかかっています。システムへの負荷が少ないウィンドウを見つけて、を実行してみてください。

1
Raj

助けてくれたタンク、それは私のALTERTABLEをブロックするクエリでした。

0
Juliano Grams