すべてのプロダクト
Search
ドキュメントセンター

Hologres:UPDATE

最終更新日:Jan 11, 2025

UPDATE ステートメントを実行して、テーブル内の指定された条件を満たす指定された列の行のデータを更新できます。このトピックでは、Hologres で UPDATE ステートメントを使用する方法について説明します。

構文

UPDATE ステートメントは、次の構文を使用します。
UPDATE <table> [ * ] [ [ AS ] <alias> ]
    SET { <column> = { <expression> } |
          ( <column> [, ...] ) = ( { <expression> } [, ...] ) } [, ...]
    [ FROM <from_list> ]
    [ WHERE <condition> ]
次の表に、構文のパラメーターを示します。
パラメーター説明
table更新するテーブルの名前。
alias更新するテーブルの代替名。
column更新するテーブルの列の名前。
expression更新された値を列に割り当てる式。
from_listソーステーブルの列の名前。
condition更新される行が満たす必要がある条件。

仕組み

Hologres では、各テーブルにデータファイル、プライマリキーインデックスファイル、およびタグファイルがあります。プライマリキーインデックスファイルの詳細については、「プライマリキー」をご参照ください。タグファイルは、主に DELETE、UPDATE、INSERT ON CONFLICT、または別のステートメントを使用してデータを削除または更新するシナリオで使用されます。次の SQL ステートメントの例は、Hologres で UPDATE ステートメントがどのように機能するかを示しています。
create table update_test (
col1 text NOT NULL PRIMARY KEY,
col2 text
);

UPDATE update_test SET col2 = 'tom' where col1 = 'a1';
データの更新中、データは最初にメモリテーブル(Mem Table)に書き込まれ、その後、ファイルに非同期的にフラッシュされます。行指向テーブルを使用する場合、新しいデータは直接新しいファイルにフラッシュされ、古いデータはコンパクションプロセス中にマージされます。列指向テーブルを使用する場合、システムはメモリ内にタグテーブルを作成し、フラッシュ操作を実行します。タグテーブルは、削除されるデータのファイル ID と行 ID を記録します。新しいデータは新しいファイルにフラッシュされ、タグテーブルはタグファイルにフラッシュされます。Hologres は、タグファイルとデータファイルのコンパクションを実行し、古いデータをクリアしてから、バックエンドでのコンパクション中に新しいデータをマージします。データ更新プロセスを高速化するために、Hologres はバックエンドにデータを書き込み、非同期コンパクションの実行時にデータを圧縮およびソートします。したがって、データ更新プロセス中にストレージ使用量が増加します。データ更新プロセスとコンパクションプロセスが完了すると、ストレージ使用量は減少します。

データ更新の原則に基づいて、列指向テーブルは常にタグテーブル内のデータのデータ記録と逆クエリプロセスを伴います。したがって、行指向テーブルの更新効率は、列指向テーブルの更新効率よりも高くなります

プライマリキーを持つ結果テーブル

テーブルにプライマリキーが指定されている場合、プライマリキーインデックスファイルのプライマリキー値に基づいて行識別子(RID)を見つけることができ、RID に基づいてデータファイルを見つけることができます。これは更新時にも当てはまります。プライマリキーに基づいて更新するファイルをすばやくフィルタリングして、ファイルスキャンを減らすことができます。プライマリキーがない場合、フルテーブル更新が実行される可能性があります。これはパフォーマンスに影響します。詳細については、「プライマリキー」をご参照ください。

部分更新

部分更新とは、指定された列のみが更新されることを示します。部分更新は Hologres 固有のものであり、さまざまなビジネス要件を満たすことができます。部分更新は、次のセクションで説明する違いを除いて、行全体の更新と同じ原則を共有します。
  • 行指向テーブルを使用する場合、テーブルはログ構造化マージ(LSM)構造を使用するため、部分更新のデータは Append Only モードで書き込まれます。
  • 列指向テーブルを使用する場合、データが列に書き込まれる前に空の列がクエリされます。これにより、リソース消費量が大幅に増加します。
  • 行と列のハイブリッドテーブルを使用する場合、空の列も最初にクエリする必要があります。行と列のハイブリッドテーブルの部分更新中は、行指向ファイルに基づいて空の列がクエリされます。これにより、列指向テーブルの部分更新と比較してリソース消費量が削減されます。
したがって、部分更新のパフォーマンスは、降順で次のようにソートされます。行指向ストレージ > 行と列のハイブリッドストレージ > 列指向ストレージ
説明 このセクションでは、SQL ステートメントは固定プランを使用して処理され、部分更新のパフォーマンスは降順で次のようにソートされます。行指向ストレージ > 行と列のハイブリッドストレージ > 列指向ストレージ。ただし、SQL ステートメントが固定プランを使用して処理されない場合、部分更新は 2 つのテーブルの結合と同等であり、部分更新のパフォーマンスは降順で次のようにソートされます。列指向ストレージ > 行と列のハイブリッドストレージ > 行指向ストレージ
次の例は、部分更新を示しています。
-- Example of a partial update: 部分更新の例:
create table update_test2 (
col1 text NOT NULL PRIMARY KEY,
col2 text,
col3 text
);

INSERT INTO update_test2 VALUES ('a1','a2','a3'),('a11','a22','a33');

-- Partial update by using the UPDATE statement: UPDATE ステートメントを使用した部分更新:
UPDATE update_test2 SET col2 = 'tom' where col1 = 'a1';

-- Partial update by using the INSERT ON CONFLICT statement: INSERT ON CONFLICT ステートメントを使用した部分更新:
INSERT INTO update_test2 (col1,col2) VALUES ('a1','tom')
ON CONFLICT(col1) DO UPDATE
SET col2 = EXCLUDED.col2;

-- Result of the partial update: 部分更新の結果:
 col1 | col2 | col3
------+------+------
 a1   | tom  | a3
 a11  | a22  | a33
(2 rows)
                

制限

  • UPDATE ステートメントは配布キーを更新しません。
  • UPDATE ステートメントは子テーブルを更新しますが、親テーブルは更新しません。
  • 実行効率を最適化するために、固定プランを使用することをお勧めします。詳細については、「UPDATE ステートメント」をご参照ください。

ステートメントの例

次の例は、Hologres で UPDATE ステートメントを使用する方法を示しています。

CREATE TABLE update_test (
  a text primary key, 
  b int not null, 
  c text not null, 
  d text);  

INSERT INTO update_test VALUES ('b1', 10, '', '');

UPDATE update_test SET b = b + 10 where a = 'b1';
UPDATE update_test SET c = 'new_' || a, d = null where b = 20;
UPDATE update_test SET (b,c,d) = (1, 'test_c', 'test_d'); 

CREATE TABLE tmp(a int);
INSERT INTO tmp VALUES (2);
UPDATE update_test SET b = tmp.a FROM tmp;

UPDATE ステートメントの詳細については、「UPDATE」をご参照ください。

FAQ

UPDATE ステートメントを実行すると、監視メトリックのストレージ使用量が増加しますが、更新操作が完了すると減少するのはなぜですか?FAQ

UPDATE ステートメントの原則に基づいて、Hologres は UPDATE ステートメントの実行中に古いデータにタグを付け、新しいデータを新しい小さなファイルにフラッシュします。Hologres は、バックエンドでのコンパクション中にこれらの小さなファイルをマージします。コンパクション中、古いデータはクリアされ、新しいデータはマージされます。データ更新プロセスを高速化するために、Hologres はバックエンドにデータを書き込み、非同期コンパクションの実行時にデータを圧縮およびソートします。これにより、データ更新プロセス中にストレージ使用量が増加します。データ更新プロセスとコンパクションプロセスが完了すると、ストレージ使用量は減少します。詳細については、「仕組み」をご参照ください。