SELECT
プロセス中に着信ステートメントに影響を与えることなく、テーブルの内容全体を置換したい。
ユースケースは、定期的に抽出されるメールボックス情報を保存するテーブルを持ち、PostgreSQLテーブルに保存する必要があることです。同じテーブルを常に照会しているアプリケーションを使用している多くのクライアントがいます。
通常、私は(擬似コード着信)のようなことをします...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
ただし、残念ながらこのプロセス中にテーブルを読み取ることはできません。INSERT INTO
完了するまでに時間がかかるためです。テーブルはロックされています。
MySQLでは、RENAME TABLE
これらの問題を回避するためにアトミックコマンドを使用していました...
CREATE TABLE table_new LIKE table;
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
PostgreSQLでこれをどのように実現できますか?
この質問の目的のために、私は外部キーを使用していないと仮定できます。
行を挿入している間、テーブルを読み取れないと思うのはなぜですか?テーブルの切り捨ては、すべてのセッションですぐに有効になります。ただし、挿入(疑似コードが示唆するように、すべてをラップするトランザクション内で行われた場合)は、コミットするまで他のセッションからは見えません。他のセッションはテーブルから選択でき、コミットするまで空のテーブルが表示されます。
—
-zgguy
@zgguy
—
ジョシュKupershmidt
TRUNCATE
コマンドはテーブルのAccessExclusiveロックを取得するため、そのトランザクションがコミットまたはロールバックされるまで、他の誰もテーブルから読み取ることができません。
delete
代わりに使用truncate
すると、遅くなりますが、読者をブロックすることはありません。何行削除する必要がありますか?
@a_horse_with_no_name通常は20〜30万行で、多くのvarchar列があります。待機時間
—
クラキー
DELETE
とは、INSERT
あまりにも長くなります。