全部产品
Search
文档中心

Hologres:UPDATE

更新时间:Jul 02, 2025

Anda dapat mengeksekusi pernyataan UPDATE untuk memperbarui baris tertentu dalam kolom yang memenuhi kondisi tertentu di sebuah tabel. Topik ini menjelaskan cara menggunakan pernyataan UPDATE di Hologres.

Sintaksis

Pernyataan UPDATE menggunakan sintaksis berikut:
UPDATE <table> [ * ] [ [ AS ] <alias> ]
    SET { <column> = { <expression> } |
          ( <column> [, ...] ) = ( { <expression> } [, ...] ) } [, ...]
    [ FROM <from_list> ]
    [ WHERE <condition> ]
Tabel berikut menggambarkan parameter dalam sintaksis.
ParameterDeskripsi
tabelNama tabel yang ingin Anda perbarui.
alias Nama pengganti untuk tabel yang ingin Anda perbarui.
kolomNama kolom dalam tabel yang ingin Anda perbarui.
ekspresiEkspresi untuk memberikan nilai yang diperbarui ke kolom.
daftar_sumberNama kolom dalam tabel sumber.
kondisiKondisi yang harus dipenuhi oleh baris yang akan diperbarui.

Cara kerjanya

Di Hologres, setiap tabel memiliki file data, file indeks kunci utama, dan file tag. Untuk informasi lebih lanjut tentang file indeks kunci utama, lihat Primary key. File tag digunakan terutama dalam skenario di mana data akan dihapus atau diperbarui menggunakan pernyataan DELETE, UPDATE, INSERT ON CONFLICT, atau lainnya. Contoh pernyataan SQL berikut menggambarkan cara kerja pernyataan UPDATE di Hologres:
create table update_test (
col1 text NOT NULL PRIMARY KEY,
col2 text
);

UPDATE update_test SET col2 = 'tom' where col1 = 'a1';
Selama pembaruan data, data pertama kali ditulis ke tabel memori (Mem Table) dan kemudian secara asinkron disimpan ke file. Jika tabel berorientasi baris digunakan, data baru langsung disimpan ke file baru, lalu data lama digabungkan selama proses kompaksi. Jika tabel berorientasi kolom digunakan, sistem membuat tabel tag di memori dan melakukan operasi penyimpanan. Tabel tag mencatat ID file dan ID baris dari data yang akan dihapus. Data baru disimpan ke file baru, dan tabel tag disimpan ke file tag. Hologres melakukan kompaksi pada file tag dan file data, membersihkan data lama, dan menggabungkan data baru selama kompaksi di backend. Untuk mempercepat proses pembaruan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat kompaksi asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat selama proses pembaruan data. Setelah proses pembaruan data dan kompaksi selesai, penggunaan penyimpanan menurun.

Berdasarkan prinsip pembaruan data, tabel berorientasi kolom selalu melibatkan proses pencatatan data dan kueri balik pada data di tabel tag. Oleh karena itu, efisiensi pembaruan tabel berorientasi baris lebih tinggi daripada tabel berorientasi kolom.

Tabel hasil dengan kunci utama

Jika kunci utama ditentukan untuk sebuah tabel, pengenal baris (RID) dapat ditemukan berdasarkan nilai kunci utama di file indeks kunci utama, lalu file data dapat ditemukan berdasarkan RID. Hal ini juga berlaku selama pembaruan. Anda dapat dengan cepat menyaring file yang akan diperbarui berdasarkan kunci utama untuk mengurangi pemindaian file. Jika tidak ada kunci utama yang tersedia, kemungkinan besar pembaruan tabel penuh dilakukan, yang memengaruhi performa. Untuk informasi lebih lanjut, lihat Primary key.

Pembaruan sebagian

Pembaruan sebagian berarti hanya kolom tertentu yang diperbarui. Pembaruan sebagian unik untuk Hologres dan dapat memenuhi berbagai kebutuhan bisnis. Pembaruan sebagian berbagi prinsip yang sama dengan pembaruan seluruh baris, kecuali perbedaan yang dijelaskan dalam bagian berikut:
  • Jika tabel berorientasi baris digunakan, data pembaruan sebagian ditulis dalam mode Append Only karena tabel menggunakan struktur log-structured merge (LSM).
  • Jika tabel berorientasi kolom digunakan, kolom kosong diperiksa sebelum data ditulis ke kolom, mengakibatkan konsumsi sumber daya yang besar.
  • Jika tabel hibrida baris-kolom digunakan, kolom kosong juga perlu diperiksa terlebih dahulu. Kolom kosong diperiksa berdasarkan file berorientasi baris selama pembaruan sebagian untuk tabel hibrida baris-kolom, mengurangi konsumsi sumber daya dibandingkan dengan pembaruan sebagian untuk tabel berorientasi kolom.
Oleh karena itu, performa pembaruan sebagian diurutkan sebagai berikut dalam urutan menurun: penyimpanan berorientasi baris > penyimpanan hibrida baris-kolom > penyimpanan berorientasi kolom.
Catatan Dalam bagian ini, pernyataan SQL diproses menggunakan rencana tetap, dan performa pembaruan sebagian diurutkan sebagai berikut dalam urutan menurun: penyimpanan berorientasi baris > penyimpanan hibrida baris-kolom > penyimpanan berorientasi kolom. Namun, jika pernyataan SQL tidak diproses menggunakan rencana tetap, pembaruan sebagian setara dengan menggabungkan dua tabel, dan performa pembaruan sebagian diurutkan sebagai berikut dalam urutan menurun: penyimpanan berorientasi kolom > penyimpanan hibrida baris-kolom > penyimpanan berorientasi baris.
Contoh berikut menunjukkan pembaruan sebagian:
-- Contoh pembaruan sebagian:
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');

-- Pembaruan sebagian menggunakan pernyataan UPDATE:
UPDATE update_test2 SET col2 = 'tom' where col1 = 'a1';

-- Pembaruan sebagian menggunakan pernyataan INSERT ON CONFLICT:
INSERT INTO update_test2 (col1,col2) VALUES ('a1','tom')
ON CONFLICT(col1) DO UPDATE
SET col2 = EXCLUDED.col2;

-- Hasil pembaruan sebagian:
 col1 | col2 | col3
------+------+------
 a1   | tom  | a3
 a11  | a22  | a33
(2 baris)
                

Batasan

  • Pernyataan UPDATE tidak memperbarui kunci distribusi.
  • Pernyataan UPDATE memperbarui tabel anak tetapi tidak memperbarui tabel induk.
  • Kami merekomendasikan Anda menggunakan rencana tetap untuk mengoptimalkan efisiensi eksekusi. Untuk informasi lebih lanjut, lihat Pernyataan UPDATE.

Contoh pernyataan

Contoh berikut menunjukkan cara menggunakan pernyataan UPDATE di Hologres:

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;

Untuk informasi lebih lanjut tentang pernyataan UPDATE, lihat UPDATE.

FAQ

Mengapa metrik pemantauan penggunaan penyimpanan meningkat ketika saya mengeksekusi pernyataan UPDATE tetapi kemudian menurun setelah operasi pembaruan selesai?FAQ

Berdasarkan prinsip pernyataan UPDATE, Hologres menandai data lama selama eksekusi pernyataan UPDATE dan menyimpan data baru ke file kecil baru. Hologres menggabungkan file kecil ini selama kompaksi di backend. Selama kompaksi, data lama dibersihkan, dan data baru digabungkan. Untuk mempercepat proses pembaruan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat kompaksi asinkron dilakukan. Hal ini menyebabkan penggunaan penyimpanan meningkat selama proses pembaruan data. Setelah proses pembaruan data dan kompaksi selesai, penggunaan penyimpanan menurun. Untuk informasi lebih lanjut, lihat Cara Kerjanya.