0

次の方法を使用してテーブルを更新する場合のパフォーマンスの違いを知りたいです。

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と通信しました。さらに調査して、これが常に当てはまるとは限らないことを確認できるかどうかを確認します。

4

1 に答える 1

1

私はPostgreSQLに精通していないので、一般的な答えしか提供できません。

まず、indexed_int_column一意でない場合、2番目のステートメントは複数の行を更新しますが、最初のステートメントは現在カーソルの下にある行のみを更新しますc_films。したがって、ステートメントは同一ではありません。

一意性とカーソルc_filmsが1つの行にあると仮定すると、カーソルindexed_int_column = 3000が特定の行の下に配置されると、カーソルがこの行の物理的な場所に直接アクセスするための情報を保持するため、更新は非常に高速になります。ただし、2番目のステートメントは、最初にインデックスをフェッチし、その中の値3000をルックアップする必要があります。そうすると、更新する行の物理的な場所がわかります。とは言うものの、このルックアップ操作は、ある時点でカーソルに対して実行する必要がありました(つまり、テーブル全体を反復処理しなかった場合)。したがって、一般に、最初にデータを読み取る必要があり、次に読み取った同じ行を更新する必要がある場合に、カーソルを使用するだけで効果があります。

于 2011-01-21T22:04:24.387 に答える