PostgreSQLのカーソルを使用した更新のパフォーマンス
-
16-10-2019 - |
質問
次の方法を使用して、テーブルの更新におけるパフォーマンスの違いを知りたいです。
UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
またはこのように:
UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;
誰もがこれをテストしたか、カーソルを使用した更新がどのように機能するかを知っているので、彼らはこれについてコメントできますか?
編集:私はこれをベンチマークしましたが、最新の例を挙げると、それが3分の1程度の速さで実行されることがわかりました。私はそれぞれのクエリを100000回実行し、違いのタイミングを上げました。サーバー側のカーソルを使用してPSYCOPG2を使用して、Postgresと通信しました。私はさらに調査して、これが常にそうであるとは限らないかどうかを確認します。
解決
私はpostgresqlに精通していないので、一般的な答えしか与えることができません。
最初に、if indexed_int_column
一意ではありません。2番目のステートメントは複数の行を更新しますが、最初のステートメントは現在カーソルの下にある行のみを更新します c_films
. 。したがって、ステートメントは同一ではありません。
一意性とカーソルc_filmsが1つの行にあると仮定する indexed_int_column = 3000
, 、次に、カーソルがこの行の物理的な場所に直接アクセスするための情報を保持するため、カーソルが特定の行の下に配置されると、更新は非常に迅速です。ただし、2番目のステートメントでは、最初にインデックスを取得し、値3000を検索する必要があり、その後、更新する行の物理的な位置がわかります。とはいえ、このルックアップ操作は、ある時点でカーソルのために行う必要がありました(テーブル全体を反復しなかった場合)。したがって、一般的に、とにかくデータを読み取る必要がある場合、カーソルを使用するだけで、読んだばかりの同じ行を更新する必要があります。