Data Manipulation Language yang dipartisi (DML yang dipartisi) dirancang untuk jenis update dan penghapusan massal berikut:
- Pembersihan berkala dan pembersihan sampah memori. Contohnya adalah menghapus baris lama atau
menetapkan kolom ke
NULL
. - Mengisi ulang kolom baru dengan nilai default. Contohnya adalah menggunakan pernyataan
UPDATE
untuk menetapkan nilai kolom baru keFalse
yang saat ini bernilaiNULL
.
DML yang dipartisi tidak cocok untuk pemrosesan transaksi berskala kecil. Jika Anda ingin menjalankan pernyataan di beberapa baris, gunakan DML transaksional dengan kunci utama yang dapat diidentifikasi. Untuk mengetahui informasi selengkapnya, lihat Menggunakan DML.
Jika perlu melakukan commit dalam jumlah besar buta tulis, tetapi tidak memerlukan transaksi atomik, Anda dapat mengubah tabel Spanner secara massal menggunakan batch operasi tulis. Untuk mengetahui informasi selengkapnya, lihat Memodifikasi data menggunakan batch operasi tulis.
Anda dapat memperoleh insight tentang kueri DML terpartisi aktif dan progresnya dari tabel statistik di database Spanner. Untuk mengetahui informasi selengkapnya, lihat Statistik DML terpartisi aktif.
DML dan DML terpartisi
Spanner mendukung dua mode eksekusi untuk pernyataan DML:
DML, yang cocok untuk pemrosesan transaksi. Untuk mengetahui informasi selengkapnya, lihat Menggunakan DML.
DML yang dipartisi, yang memungkinkan operasi seluruh database berskala besar dengan dampak minimal terhadap pemrosesan transaksi serentak dengan mempartisi ruang kunci dan menjalankan pernyataan melalui partisi dalam transaksi terpisah dengan cakupan yang lebih kecil. Untuk mengetahui informasi selengkapnya, lihat Menggunakan DML yang dipartisi.
Tabel berikut menyoroti beberapa perbedaan antara kedua mode eksekusi tersebut.
DML | DML yang dipartisi |
---|---|
Baris yang tidak cocok dengan klausa WHERE mungkin dikunci. |
Hanya baris yang cocok dengan klausa WHERE yang dikunci. |
Batas ukuran transaksi berlaku. | Spanner menangani batas transaksi dan batas serentak per transaksi. |
Pernyataan tidak harus idempoten. | Pernyataan DML harus idempoten untuk memastikan hasil yang konsisten. |
Sebuah transaksi dapat mencakup beberapa pernyataan DML dan SQL. | Transaksi yang dipartisi hanya dapat menyertakan satu pernyataan DML. |
Tidak ada batasan pada kompleksitas pernyataan. | Pernyataan harus dapat dipartisi sepenuhnya. |
Anda membuat transaksi baca-tulis dalam kode klien. | Spanner yang membuat transaksi. |
Dapat dipartisi dan idempoten
Saat pernyataan DML terpartisi berjalan, baris dalam satu partisi tidak memiliki akses
ke baris di partisi lain, dan Anda tidak dapat memilih cara Spanner membuat
partisi. Partisi memastikan skalabilitas, tetapi juga berarti bahwa
pernyataan DML yang dipartisi harus dapat dipartisi sepenuhnya. Artinya, pernyataan DML yang dipartisi harus dinyatakan sebagai gabungan dari kumpulan
pernyataan, di mana setiap pernyataan mengakses satu baris tabel dan setiap
pernyataan tidak mengakses tabel lain. Misalnya, pernyataan DML yang mengakses beberapa tabel atau melakukan penggabungan mandiri tidak dapat dipartisi. Jika pernyataan DML tidak dapat dipartisi, Spanner akan menampilkan error BadUsage
.
Pernyataan DML ini sepenuhnya dapat dipartisi, karena setiap pernyataan dapat diterapkan ke satu baris dalam tabel:
UPDATE Singers SET LastName = NULL WHERE LastName = '';
DELETE FROM Albums WHERE MarketingBudget > 10000;
Pernyataan DML ini tidak sepenuhnya dapat dipartisi, karena dapat mengakses beberapa tabel:
# Not fully partitionable
DELETE FROM Singers WHERE
SingerId NOT IN (SELECT SingerId FROM Concerts);
Spanner dapat mengeksekusi pernyataan DML terpartisi beberapa kali terhadap beberapa partisi karena percobaan ulang tingkat jaringan. Akibatnya, pernyataan mungkin dijalankan lebih dari sekali terhadap satu baris. Oleh karena itu, pernyataan tersebut harus bersifat idempoten untuk memberikan hasil yang konsisten. Suatu pernyataan bersifat idempoten jika mengeksekusinya beberapa kali terhadap satu baris akan memberikan hasil yang sama.
Pernyataan DML ini bersifat idempoten:
UPDATE Singers SET MarketingBudget = 1000 WHERE true;
Pernyataan DML ini tidak idempoten:
UPDATE Singers SET MarketingBudget = 1.5 * MarketingBudget WHERE true;
Penguncian baris
Spanner hanya memperoleh kunci jika baris merupakan kandidat untuk pembaruan atau penghapusan. Perilaku ini berbeda dengan
eksekusi DML, yang mungkin membaca-kunci
baris yang tidak cocok dengan klausa WHERE
.
Eksekusi dan transaksi
Apakah pernyataan DML dipartisi atau tidak bergantung pada metode library klien yang Anda pilih untuk dieksekusi. Setiap library klien menyediakan metode terpisah untuk eksekusi DML dan eksekusi DML Terpartisi.
Anda hanya dapat menjalankan satu pernyataan DML yang dipartisi dalam panggilan ke metode library klien.
Spanner tidak menerapkan pernyataan DML terpartisi secara atomik di seluruh tabel. Namun, Spanner menerapkan pernyataan DML yang terpartisi secara atomik di setiap partisi.
DML yang dipartisi tidak mendukung commit atau rollback. Spanner akan segera mengeksekusi dan menerapkan pernyataan DML.
- Jika Anda membatalkan operasi, Spanner akan membatalkan partisi eksekusi dan tidak memulai partisi yang tersisa. Spanner tidak me-roll back partisi yang telah dieksekusi.
- Jika eksekusi pernyataan menyebabkan error, eksekusi akan berhenti
di semua partisi dan Spanner akan menampilkan error tersebut
untuk seluruh operasi. Beberapa contoh error adalah pelanggaran batasan
jenis data, pelanggaran
UNIQUE INDEX
, dan pelanggaranON DELETE NO ACTION
. Bergantung pada waktu ketika eksekusi gagal, pernyataan tersebut mungkin telah berhasil dijalankan pada beberapa partisi, dan mungkin tidak pernah dijalankan pada partisi lain.
Jika pernyataan DML yang telah dipartisi berhasil, Spanner akan menjalankan pernyataan setidaknya satu kali pada setiap partisi rentang kunci.
Jumlah baris yang diubah
Pernyataan DML yang dipartisi menampilkan batas bawah pada jumlah baris yang diubah. Jumlah ini mungkin bukan jumlah pasti dari jumlah baris yang diubah, karena tidak ada jaminan bahwa Spanner akan menghitung semua baris yang diubah.
Batas transaksi
Spanner membuat partisi dan transaksi yang diperlukan untuk mengeksekusi pernyataan DML yang dipartisi. Batas transaksi atau batas serentak per transaksi berlaku, tetapi Spanner berupaya menjaga transaksi agar tidak melebihi batas.
Spanner mengizinkan maksimum 20.000 pernyataan DML terpartisi secara serentak per database.
Fitur yang tidak didukung
Spanner tidak mendukung beberapa fitur untuk DML terpartisi:
INSERT
tidak didukung.- Konsol Google Cloud: Anda tidak dapat mengeksekusi pernyataan DML terpartisi di konsol Google Cloud.
- Paket kueri dan pembuatan profil: Google Cloud CLI dan library klien tidak mendukung paket kueri dan pembuatan profil.
- {i>Subquery<i} yang membaca dari tabel lain, atau baris berbeda dari tabel yang sama.
Untuk skenario yang kompleks, seperti memindahkan tabel atau transformasi yang memerlukan penggabungan di seluruh tabel, pertimbangkan untuk menggunakan konektor Dataflow.
Contoh
Contoh kode berikut memperbarui kolom MarketingBudget
pada tabel Albums
.
C++
Anda menggunakan fungsi ExecutePartitionedDml()
untuk mengeksekusi pernyataan DML yang dipartisi.
C#
Anda menggunakan metode ExecutePartitionedUpdateAsync()
untuk mengeksekusi pernyataan DML yang dipartisi.
Go
Anda menggunakan metode PartitionedUpdate()
untuk mengeksekusi pernyataan DML yang dipartisi.
Java
Anda menggunakan metode executePartitionedUpdate()
untuk mengeksekusi pernyataan DML yang dipartisi.
Node.js
Anda menggunakan metode runPartitionedUpdate()
untuk mengeksekusi pernyataan DML yang dipartisi.
PHP
Anda menggunakan metode executePartitionedUpdate()
untuk mengeksekusi pernyataan DML yang dipartisi.
Python
Anda menggunakan metode execute_partitioned_dml()
untuk mengeksekusi pernyataan DML yang dipartisi.
Ruby
Anda menggunakan metode execute_partitioned_update()
untuk mengeksekusi pernyataan DML yang dipartisi.
Contoh kode berikut menghapus baris dari tabel Singers
, berdasarkan kolom
SingerId
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Apa langkah selanjutnya?
Pelajari cara mengubah data Menggunakan DML.
Untuk mempelajari perbedaan antara DML dan mutasi, baca artikel Membandingkan DML dan Mutasi
Pertimbangkan menggunakan konektor Dataflow untuk skenario transformasi data lainnya.