View a markdown version of this page

Perintah SQL - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog yang diterbitkan pada 30 Juni 2025.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Perintah SQL

Tabel Apache Iceberg di Amazon Redshift menyediakan cara ampuh untuk mengelola kumpulan data analitik besar di danau data Anda. Tabel ini mendukung transaksi ACID, evolusi skema, dan kemampuan perjalanan waktu sambil mempertahankan kinerja tinggi untuk beban kerja analitik. Menggunakan tabel Apache Iceberg, Anda dapat mengatur dan mempartisi data secara efisien, mengontrol format file dan kompresi, dan mengintegrasikan dengan mulus dengan AWS layanan lain.

Anda dapat membuat tabel Iceberg yang dipartisi dan tidak dipartisi menggunakan perintah dan. CREATE TABLE ... USING ICEBERG CREATE TABLE ... USING ICEBERG AS SELECT Anda dapat mereferensikan tabel Iceberg menggunakan notasi skema eksternal (external_schema.table_name) atau notasi tiga bagian ("catalog_name".database_name.table_name). Contoh-contoh di bagian ini menunjukkan kedua metode tersebut.

Setelah Anda membuat tabel, Anda dapat menambahkan data menggunakan INSERT perintah standar. Perlu diingat bahwa meskipun Amazon Redshift bekerja dengan banyak tipe data Iceberg, Anda mungkin perlu mengonversi beberapa format data saat memasukkan informasi.

Anda dapat melihat tabel Iceberg menggunakan SHOW TABLES perintah. Jika Anda ingin menghapus tabel dari AWS Glue Data Catalog, Anda dapat menggunakan DROP TABLE perintah. Perhatikan bahwa ini hanya menghapus pendaftaran tabel. Data aktual akan tetap di penyimpanan sampai Anda menghapusnya secara terpisah.

Anda juga dapat memodifikasi data yang ada menggunakan DELETEUPDATE,, dan MERGE perintah. Untuk mengubah definisi tabel seperti skema, spesifikasi partisi, dan properti, lihatMengubah definisi tabel. Pernyataan DDL lain yang tidak didokumentasikan di sana tidak didukung untuk tabel Iceberg.

Anda dapat menulis ke tabel Iceberg yang tidak dibuat oleh Amazon Redshift. Namun, ada beberapa batasan:

  • Tabel harus berupa tabel Iceberg v2 atau v3.

  • Tabel harus menggunakan Parquet sebagai format data default.

  • Tabel tidak boleh memiliki kompresi metadata yang disetel ke True.

  • Tabel tidak boleh diaktifkan Write-Audit-Publish (WAP).

Bagian berikut menunjukkan sintaks SQL untuk membuat, menyisipkan, memodifikasi, dan mengelola tabel Iceberg di Amazon Redshift.

CREATE TABLE

CREATE TABLE [IF NOT EXISTS] <external_schema>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:

CREATE TABLE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Untuk katalog awsdatacatalog root yang dipasang secara otomatis:

CREATE TABLE awsdatacatalog.<database_name>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Saat menggunakan sintaks skema eksternal, perhatikan bahwa <external_schema> harus merupakan nama skema eksternal yang ada di mana tabel eksternal akan dibuat. Untuk informasi selengkapnya tentang cara membuat dan mengelola skema eksternal, lihat MEMBUAT SKEMA EKSTERNAL di dokumentasi Amazon Redshift.

Kla LOCATION usa mendefinisikan lokasi tabel untuk tabel Iceberg yang baru dibuat ini. LOCATIONdiperlukan untuk tabel yang dibuat menggunakan skema eksternal atau katalog awsdatacatalog root. Seharusnya lokasi kosong, artinya tidak ada objek Amazon S3 yang ada yang berbagi bucket dan awalan yang sama ini. Wilayah bucket Amazon S3 harus berada di Wilayah yang sama dengan cluster Amazon Redshift. Untuk bucket tabel Amazon S3, LOCATION tidak dapat ditentukan karena lokasi tabel ditentukan oleh katalog tabel Amazon S3 (s3tablescatalog).

Namun, AWS menyediakan metode untuk mereplikasi data dari tabel Iceberg yang disimpan AWS Glue Data Catalog dalam satu Wilayah AWS ke yang berbeda Wilayah AWS, yang memungkinkan Anda untuk mereplikasi penulisan ke Wilayah yang berbeda. Untuk informasi selengkapnya, lihat Mer eplikasi data di seluruh Wilayah AWS.

PARTITIONED BYmendefinisikan partisi tabel Iceberg. Amazon Redshift mendukung semua transformasi partisi Iceberg v2 kecuali untuk. void Berikut adalah daftar transformasi yang didukung:

  • identitas

  • keranjang [N]

  • memotong [W]

  • tahun

  • bulan

  • hari

  • jam

Untuk definisi lengkap transformasi ini dan tipe data yang kompatibel, lihat Transformasi Partisi dalam dokumentasi Apache Iceberg.

Men PARTITIONED BY dukung partisi multi-level. Misalnya, Anda dapat menjalankan perintah berikut:

CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, id), year(ship_date));

Namun, Amazon Redshift tidak mendukung penggunaan satu kolom dalam lebih dari satu transformasi. Misalnya, sintaks berikut tidak didukung:

CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, ship_date), year(ship_date));

Kla TABLE PROPERTIES usa mendefinisikan properti tabel tambahan untuk tabel Iceberg ini. Properti tabel yang didukung adalah format-version dancompression_type. Pro format-version perti menentukan versi format tabel Iceberg. Nilai yang mungkin adalah '2' (default) dan'3'. Pro compression_type perti mendefinisikan kompresi file data Parquet default. Jika tidak ditentukan, snappy digunakan sebagai codec kompresi. Nilai yang mungkin untuk compression_type adalah:zstd,brotli,gzip,snappy, danuncompressed.

Untuk tabel Iceberg v3, Anda dapat menentukan nilai default untuk kolom menggunakan kata kunci DEFAULT. Nilai kolom default hanya didukung untuk tabel Iceberg v3. Amazon Redshift mengembalikan kesalahan jika Anda menentukan nilai default pada tabel Iceberg v2. Hanya nilai literal yang didukung sebagai default.

CREATE TABLE <external_schema>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('format-version'='3' [, 'compression_type'='<compression_value>'])];

Contoh dengan default:

-- External schema notation CREATE TABLE my_external_schema.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG TABLE PROPERTIES ('format-version'='3');
catatan

CREATE TABLE ... LIKE ...tidak didukung untuk tabel Iceberg. Tabel gunung es juga tidak mendukung batasan kolom dan atribut kolom seperti tabel RMS.

Atau, Anda dapat membuat dan mengisi tabel Iceberg dalam satu operasi menggunakan: CREATE TABLE AS SELECT

BUAT TABEL SEBAGAI PILIHAN

CREATE TABLE <external_schema>.<table_name> [( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query

Anda juga dapat menggunakan notasi tiga bagian untuk membuat tabel dalam katalog yang dipasang secara otomatis:

CREATE TABLE "<catalog_name>".<database_name>.<table_name> [( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query

Ini mirip dengan CREATE TABLE pernyataan kecuali CREATE yang diikuti oleh SELECT pernyataan untuk mengisi tabel dengan hasil SELECT kueri.

Anda tidak dapat lagi menentukan tipe data dengan CREATE TABLE klausa di sini, karena SELECT kueri menentukan tipe data kolom.

Jika ku SELECT eri gagal karena alasan apa pun, kueri ini akan gagal dan tabel Iceberg tidak akan dibuat.

Untuk tabel Iceberg v3, tentukan 'format-version'='3' dalam klausa TABLE PROPERTIES. Nilai kolom default tidak diwarisi dari tabel sumber.

-- External schema notation CREATE TABLE my_external_schema.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM my_external_schema.orders; -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM awsdatacatalog.my_glue_db.orders; -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders_backup ( order_id, status, region ) USING ICEBERG TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders;

Anda dapat melihat struktur tabel Iceberg Anda menggunakan: SHOW TABLE

TAMPILKAN TABEL

SHOW TABLE <external_schema>.<table_name>

Anda juga dapat menggunakan notasi tiga bagian dengan katalog yang dipasang secara otomatis:

SHOW TABLE "<catalog_name>".<database_name>.<table_name>

SHOW TABLEmenampilkan CREATE TABLE pernyataan untuk tabel Iceberg. Perintah akan menunjukkan hasil yang sesuai berdasarkan jenis tabel. Berikut ini adalah contoh SHOW TABLE output untuk tabel Iceberg:

CREATE TABLE my_schema.items (id int, price decimal(5, 2)) USING ICEBERG LOCATION 's3://my_s3_bucket/items/' PARTITIONED BY (bucket(16, id)) TABLE PROPERTIES ('compression_type'='snappy')
catatan

Untuk tabel Amazon S3, karena lokasi tabel dikelola oleh katalog tabel Amazon S3, LOCATION klausa akan dihilangkan dalam SHOW TABLE hasil.

Untuk tabel Iceberg v3, SHOW TABLE menampilkan nilai kolom default dalam outputnya.

SHOW TABLE my_external_schema.orders; -- Output includes the default values in the column definitions: CREATE TABLE my_external_schema.orders ( id int, status varchar DEFAULT 'active', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');

Setelah membuat tabel, Anda dapat menambahkan data menggunakanINSERT INTO:

MASUKKAN KE

INSERT INTO <external_schema>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO <external_schema>.<table_name> [(column_name [, ...])] (SELECT query) -- Using three-part notation for S3 table buckets: INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [(column_name [, ...])] (SELECT query) -- Using three-part notation for the awsdatacatalog root catalog: INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] (SELECT query)

Anda dapat membuat INSERT INTO tabel Iceberg menggunakan sintaks di atas. Jika VALUES klausa digunakan, Anda memberikan nilai untuk kolom yang terdaftar olehcolumn_name, atau semua kolom jika column_name bagian dihilangkan.

Ketika data dimasukkan ke dalam tabel partisi, baris baru didistribusikan sesuai dengan spesifikasi partisi yang telah ditentukan. Jika karena alasan apa pun ku SELECT eri gagal, kueri akan gagal dan tidak ada data yang akan dimasukkan ke dalam tabel Iceberg.

Untuk tabel Iceberg v3 dengan nilai kolom default, jika kolom dengan default dihilangkan dari pernyataan INSERT atau DEFAULT ditentukan sebagai nilai, nilai default ditulis ke file data.

DELETE

Ku DELETE eri untuk tabel Iceberg menggunakan DELETE sintaks yang ada di tabel RMS:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] iceberg_table [ { USING } table_name, ... ] [ WHERE condition ]

Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [ { USING } table_name, ... ] [ WHERE condition ]

Untuk katalog awsdatacatalog root yang dipasang secara otomatis:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] awsdatacatalog.<database_name>.<table_name> [ { USING } table_name, ... ] [ WHERE condition ]

iceberg_tableDapat direferensikan menggunakan <external_schema>.<external_table_name> formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Referensi tabel Iceberg di Amazon Redshift.

Kla table_name usa USING dalam akan digunakan untuk bergabung dengan tabel target untuk menghapus baris yang puas dengan WHERE kondisi tersebut. Bisa table_name berupa tabel Iceberg atau tabel Amazon Redshift RMS.

Karena Iceberg menggunakan skema partisi tersembunyi, pengguna dapat menggunakan DELETE query untuk menghapus partisi, mencapai efek yang sama seperti ALTER TABLE ... DROP PARTITION ... untuk tabel Hive.

Misalnya, pertimbangkan tabel Iceberg yang dipartisi seperti berikut:

CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date;

Kemudian Anda dapat menghapus partisi dengan menggunakan query seperti berikut:

DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';

Untuk kueri seperti ini, Amazon Redshift akan mengoptimalkan eksekusi untuk hanya melakukan operasi metadata saja dan korsleting eksekusi. Jadi tidak seperti DELETE kueri normal, kueri penghapusan metadata saja tidak menunjukkan langkah-langkah eksekusi diEXPLAIN:

explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231'; QUERY PLAN ------------ "XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)" (0 rows)

UPDATE

Sintak UPDATE s kueri untuk tabel Iceberg sangat mirip dengan UPDATE sintaks yang ada untuk tabel RMS:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE iceberg_table [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

Untuk katalog awsdatacatalog root yang dipasang secara otomatis:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE awsdatacatalog.<database_name>.<table_name> [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

iceberg_tableDapat direferensikan menggunakan <external_schema>.<external_table_name> formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Referensi tabel Iceberg di Amazon Redshift.

Anda dapat memperbarui tabel dengan mereferensikan informasi di tabel lain. Buat daftar tabel lain ini dalam klausa FROM atau gunakan subquery sebagai bagian dari kondisi WHERE. Tabel sumber dapat berupa tabel Iceberg atau tabel Amazon Redshift RMS.

UPDATEjuga dapat berjalan pada tabel yang dipartisi. Ketika UPDATE mengubah nilai kolom yang termasuk dalam spesifikasi partisi saat ini, baris baru yang diperbarui akan dimasukkan ke dalam partisi baru berdasarkan nilai yang baru diperbarui.

Misalnya, pertimbangkan tabel Iceberg yang dipartisi seperti berikut:

CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date; INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);

Dan ketika Anda menjalankan kueri pembaruan berikut:

UPDATE my_external_schema.lineitem SET l_ship_date = '20260101' WHERE l_item_id = 10099;

baris dengan l_item_id 10099 bergerak dari partisi 20251231 ke partisi 20260101 baru.

Penting juga untuk dicatat bahwa itu mungkin UPDATE memiliki beberapa nilai kandidat. Pertimbangkan pertanyaan di bawah ini:

CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...; CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...; INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30); INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50); UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;

Dalam hal ini, y1 bisa 40 atau 50. Hasilnya adalah nondeterministik. Anda dapat mengatur parameter konfigurasi error_on_nondeterministic_update ke true untuk memaksa kesalahan kueri ketika kasus seperti itu terjadi. Ini konsisten dengan UPDATE perilaku tabel RMS yang ada. Untuk selengkapnya, lihat error _on_nondeterministic_update.

MERGE

Ku MERGE eri secara kondisional menggabungkan baris dari tabel sumber ke tabel target. Ini berbagi sintaks MERGE kueri yang sama dengan tabel RMS yang ada:

MERGE INTO target_iceberg_table USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:

MERGE INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

Untuk katalog awsdatacatalog root yang dipasang secara otomatis:

MERGE INTO awsdatacatalog.<database_name>.<table_name> USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

target_iceberg_tableDapat direferensikan menggunakan <external_schema>.<external_table_name> formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Referensi tabel Iceberg di Amazon Redshift.

Bisa source_table berupa tabel Iceberg atau tabel Amazon Redshift RMS.

Ketika REMOVE DUPLICATES digunakan, MERGE perintah menggunakan mode yang disederhanakan. Untuk detail lebih lanjut tentang mode yang disederhanakan, silakan merujuk ke dokumen MERGE perintah asli.

Saat menjalankan MERGE kueri, Amazon Redshift menghasilkan dan menyimpan file data perantara di lokasi tabel target. File-file ini akan dikumpulkan sampah di akhir kueri. Karena itu, MERGE query akan memerlukan DELETE izin pada bucket Amazon S3 agar berfungsi dengan baik. Kesalahan izin yang tidak mencukupi akan muncul jika operasi pengumpulan sampah gagal. Untuk tabel Amazon S3 pengumpulan sampah dikelola oleh layanan tabel Amazon S3. Oleh karena itu DELETE izin tidak diperlukan untuk menjalankan MERGE query.

MEJA DROP

Untuk menghapus tabel Iceberg dari katalog, gunakan DROP TABLE perintah:

DROP TABLE <external_schema>.<table_name>

Anda juga dapat menggunakan notasi tiga bagian dengan katalog yang dipasang secara otomatis:

DROP TABLE "<catalog_name>".<database_name>.<table_name>

Menjatuhkan tabel Iceberg adalah operasi khusus metadata. Ini menghapus entri tabel dari AWS Glue Data Catalog dan katalog tabel Amazon S3, jika ini adalah tabel Amazon S3. Amazon Redshift tidak membersihkan atau menghapus file data atau file metadata yang ada di bawah lokasi tabel. Anda dapat menggunakan fitur di AWS Glue dan tabel Amazon S3 untuk menghapus file yatim piatu. Untuk AWS Glue, lihat Menghapus file yatim piatu. Untuk tabel Amazon S3, lihat Pem eliharaan tabel.