私は PostgreSQL の初心者だと思われるかもしれません。この質問の目的は、この問題に対して PostgreSQL から最高のパフォーマンスを引き出す方法について洞察を得ることです。構造は同じですが、内容が異なる 2 つのテーブルがあります。
|Table A|
key - value
1 dave
2 paul
3 michael
|Table B|
key - value
1 dave
2 chris
問題は単純で、テーブル A をテーブル B に置き換えますが、操作でどのエントリがテーブル A に挿入またはテーブル A から削除されたかを知る必要があります。
私の最初の (素朴な) 解決策は、テーブル結合を使用して 2 段階で作業を行い、最初に削除操作、次に挿入操作の中間リストを生成することです。これらのクエリの結果はクライアントに保存され、アプリケーションが正しく機能するために必要です。
SELECT * FROM A LEFT JOIN B ON A.value = B.value WHERE B.value IS NULL;
DELETE FROM A WHERE value IN ("paul", "michael");
SELECT * FROM B LEFT JOIN A ON A.value = B.value WHERE A.value IS NULL;
INSERT INTO A (value) VALUES "chris";
この単純なアプローチは技術的には機能します。トランザクションの終わりまでに、テーブル A にはテーブル B と同じコンテンツが含まれますが、この戦略はすぐに非常に遅くなります。テーブルのサイズを示すには、数百万行の範囲にあるため、大規模なパフォーマンスは重要な要素であり、より最適なアプローチを見つけることが望ましいでしょう.
パフォーマンス要件に対処するために、次のことを調査する予定です。
- 最適なキー値ストレージ パフォーマンスのための HStore バックエンドの使用。
- 中間の削除/挿入クエリを事前計算するためのビューの使用。
- 準備済みクエリを使用して、SQL 処理のオーバーヘッドを削減します。
専門家への私の質問は、あなたが最適な戦略であると考えるものを提案してもらえますか. 私の質問の範囲を少し超えていますが、提案できる厳格で迅速なルールはありますか?
お時間をいただきありがとうございました。すべてのフィードバックは大歓迎です。