Mengubah data dengan bahasa manipulasi data (DML)

Bahasa manipulasi data (DML) BigQuery memungkinkan Anda mengupdate, menyisipkan, dan menghapus data dari tabel BigQuery.

Anda dapat menjalankan pernyataan DML seperti yang Anda lakukan pada pernyataan SELECT, dengan kondisi berikut:

  • Anda harus menggunakan GoogleSQL. Untuk mengaktifkan GoogleSQL, lihat Mengalihkan dialek SQL.
  • Anda tidak dapat menentukan tabel tujuan untuk kueri.

Untuk mengetahui daftar pernyataan DML BigQuery dan contoh cara menggunakannya, lihat Pernyataan bahasa manipulasi data di GoogleSQL. Untuk mengetahui informasi selengkapnya tentang cara menghitung jumlah byte yang diproses oleh pernyataan DML, lihat Penghitungan ukuran kueri sesuai permintaan.

Tugas serentak

BigQuery mengelola serentak pernyataan DML yang menambahkan, mengubah, atau menghapus baris dalam tabel.

Konkurensi DML INSERT

Selama periode 24 jam, 1.500 pernyataan INSERT pertama akan langsung dijalankan setelah dikirim. Setelah batas ini tercapai, konkurensi pernyataan INSERT yang menulis ke tabel dibatasi hingga 10. Pernyataan INSERT tambahan ditambahkan ke antrean PENDING. Hingga 100 pernyataan INSERT dapat dimasukkan ke dalam antrean untuk tabel pada waktu tertentu. Setelah pernyataan INSERT selesai, pernyataan INSERT berikutnya akan dihapus dari antrean dan dijalankan.

Jika Anda harus menjalankan pernyataan INSERT DML lebih sering, pertimbangkan untuk melakukan streaming data ke tabel menggunakan Storage Write API.

Konkurensi DML UPDATE, DELETE, MERGE

Pernyataan DML UPDATE, DELETE, dan MERGE disebut pernyataan DML yang diubah. Jika Anda mengirimkan satu atau beberapa pernyataan DML bermutasi pada tabel saat tugas DML bermutasi lainnya di dalamnya masih berjalan (atau tertunda), BigQuery akan menjalankan hingga 2 tugas secara serentak, setelah itu hingga 20 diantrekan sebagai PENDING. Saat tugas yang sebelumnya berjalan selesai, tugas berikutnya yang tertunda akan dikeluarkan dari antrean dan dijalankan. Pernyataan DML bermutasi yang diantrekan berbagi antrean per tabel dengan panjang maksimum 20. Pernyataan tambahan setelah panjang antrean maksimum untuk setiap tabel gagal dengan pesan error: Resources exceeded during query execution: Too many DML statements outstanding against table PROJECT_ID:TABLE, limit is 20.

Tugas DML prioritas interaktif yang diantrekan selama lebih dari 6 jam akan gagal dengan pesan error berikut:

DML statement has been queued for too long

Konflik pernyataan DML

Memutasi pernyataan DML yang berjalan secara serentak pada tabel menyebabkan konflik pernyataan DML saat pernyataan mencoba memutasi partisi yang sama. Pernyataan berhasil selama tidak mengubah partisi yang sama. BigQuery mencoba menjalankan ulang pernyataan yang gagal hingga tiga kali.

  • Pernyataan DML INSERT yang menyisipkan baris ke tabel tidak bertentangan dengan pernyataan DML lain yang berjalan secara serentak.

  • Pernyataan DML MERGE tidak bertentangan dengan pernyataan DML lain yang berjalan secara serentak selama pernyataan tersebut hanya menyisipkan baris dan tidak menghapus atau memperbarui baris yang ada. Hal ini dapat mencakup pernyataan MERGE dengan klausul UPDATE atau DELETE, selama klausul tersebut tidak dipanggil saat kueri berjalan.

DML terperinci

DML terperinci adalah peningkatan performa yang dirancang untuk mengoptimalkan eksekusi pernyataan UPDATE, DELETE, dan MERGE (juga dikenal sebagai pernyataan DML yang bermutasi). Tanpa mengaktifkan DML terperinci, mutasi dilakukan di tingkat grup file, yang dapat menyebabkan penulisan ulang data yang tidak efisien. DML terperinci memperkenalkan pendekatan yang lebih terperinci yang bertujuan untuk mengurangi jumlah data yang perlu ditulis ulang, dan untuk mengurangi penggunaan slot secara keseluruhan.

Untuk menyatakan minat dalam mendaftarkan project ke pratinjau DML terperinci, isi formulir pendaftaran DML terperinci BigQuery. Project didaftarkan secara selektif berdasarkan evaluasi workload Anda.

Mengaktifkan DML terperinci

Untuk mengaktifkan DML terperinci, tetapkan opsi tabel enable_fine_grained_mutations ke TRUE saat Anda menjalankan pernyataan DDL CREATE TABLE atau ALTER TABLE.

Untuk membuat tabel baru dengan DML terperinci, gunakan pernyataan CREATE TABLE:

CREATE TABLE mydataset.mytable (
  product STRING,
  inventory INT64)
OPTIONS(enable_fine_grained_mutations = TRUE);

Untuk mengubah tabel yang ada dengan DML terperinci, gunakan pernyataan ALTER TABLE:

ALTER TABLE mydataset.mytable
SET OPTIONS(enable_fine_grained_mutations = TRUE);

Setelah opsi enable_fine_grained_mutations ditetapkan ke TRUE, pernyataan DML yang memodifikasi akan dijalankan dengan kemampuan DML terperinci yang diaktifkan dan menggunakan sintaksis pernyataan DML yang ada.

Untuk menonaktifkan DML terperinci pada tabel, tetapkan enable_fine_grained_mutations ke FALSE menggunakan pernyataan DDL ALTER TABLE.

Harga

Mengaktifkan DML terperinci untuk tabel dapat menimbulkan biaya penyimpanan BigQuery tambahan untuk menyimpan metadata mutasi tambahan yang terkait dengan operasi DML terperinci. Biaya sebenarnya bergantung pada jumlah data yang diubah, tetapi untuk sebagian besar situasi, biaya ini diperkirakan tidak signifikan jika dibandingkan dengan ukuran tabel itu sendiri.

Project yang dikonfigurasi untuk menggunakan reservasi menggunakan slot untuk memproses pernyataan DML terperinci, termasuk pemrosesan latar belakang metadata tabel atau mutasi.

Pertimbangan data yang dihapus

Operasi DML terperinci memproses data yang dihapus secara offline.

Project yang melakukan operasi DML terperinci tanpa proses penetapan BACKGROUND akan menghapus data menggunakan harga on-demand. Dalam hal ini, pemrosesan data yang dihapus dilakukan secara rutin menggunakan resource BigQuery internal.

Project yang melakukan operasi DML terperinci dengan penetapan BACKGROUND memproses data yang dihapus menggunakan slot, dan tunduk pada ketersediaan resource reservasi yang dikonfigurasi. Jika tidak tersedia cukup resource dalam pemesanan yang dikonfigurasi, pemrosesan data yang dihapus mungkin memerlukan waktu lebih lama daripada yang diperkirakan.

Batasan

Tabel yang diaktifkan dengan DML terperinci tunduk pada batasan berikut:

  • Anda tidak dapat menggunakan metode tabledata.list untuk membaca konten dari tabel dengan DML terperinci yang diaktifkan. Sebagai gantinya, gunakan Storage Read API untuk membaca data tabel menggunakan API.
  • Anda tidak dapat membuat snapshot tabel atau clone tabel dari tabel dengan DML terperinci yang diaktifkan.
  • Anda tidak dapat mengaktifkan DML terperinci pada tabel di set data yang direplikasi, dan Anda tidak dapat mereplikasi set data yang berisi tabel dengan DML terperinci yang diaktifkan.
  • Pernyataan DML yang dieksekusi dalam transaksi multi-pernyataan tidak dioptimalkan dengan DML terperinci.

Praktik terbaik

Untuk performa terbaik, Google merekomendasikan pola berikut:

  • Hindari mengirimkan update atau penyisipan baris individual dalam jumlah besar. Sebagai gantinya, kelompokkan operasi DML jika memungkinkan. Untuk mengetahui informasi selengkapnya, lihat Pernyataan DML yang memperbarui atau menyisipkan baris tunggal.

  • Jika pembaruan atau penghapusan umumnya terjadi pada data lama, atau dalam rentang tanggal tertentu, pertimbangkan untuk mempartisi tabel Anda. Partisi memastikan bahwa perubahan dibatasi pada partisi tertentu dalam tabel.

  • Hindari partisi tabel jika jumlah data di setiap partisi kecil dan setiap pembaruan mengubah sebagian besar partisi.

  • Jika Anda sering memperbarui baris dengan satu atau beberapa kolom yang berada dalam rentang nilai yang sempit, sebaiknya gunakan tabel yang dikelompokkan. Clustering memastikan bahwa perubahan dibatasi pada kumpulan blok tertentu, sehingga mengurangi jumlah data yang perlu dibaca dan ditulis. Berikut adalah contoh pernyataan UPDATE yang memfilter rentang nilai kolom:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id BETWEEN 54 AND 75;

    Berikut adalah contoh serupa yang memfilter daftar kecil nilai kolom:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id IN (54, 57, 60);

    Pertimbangkan pengelompokan pada kolom id dalam kasus ini.

  • Jika Anda memerlukan fungsi OLTP, pertimbangkan untuk menggunakan kueri gabungan Cloud SQL, yang memungkinkan BigQuery membuat kueri data yang berada di Cloud SQL.

Untuk mengetahui praktik terbaik guna mengoptimalkan performa kueri, lihat Pengantar cara mengoptimalkan performa kueri.

Batasan

  • Setiap pernyataan DML memulai transaksi implisit, yang berarti perubahan yang dilakukan oleh pernyataan tersebut akan otomatis di-commit di akhir setiap pernyataan DML yang berhasil.

  • Baris yang baru-baru ini ditulis menggunakan metode streaming tabledata.insertall tidak dapat diubah dengan bahasa pengolahan data (DML), seperti pernyataan UPDATE, DELETE, MERGE, atau TRUNCATE. Operasi tulis terbaru adalah operasi yang terjadi dalam 30 menit terakhir. Semua baris lain dalam tabel tetap dapat diubah menggunakan pernyataan UPDATE, DELETE, MERGE, atau TRUNCATE. Data yang di-streaming dapat memerlukan waktu hingga 90 menit untuk tersedia bagi operasi salin.

    Atau, baris yang baru-baru ini ditulis menggunakan Storage Write API dapat diubah menggunakan pernyataan UPDATE, DELETE, atau MERGE. Untuk informasi selengkapnya, lihat Menggunakan bahasa manipulasi data (DML) dengan data yang baru di-streaming.

  • Subkueri yang berkorelasi dalam when_clause, search_condition, merge_update_clause, atau merge_insert_clause tidak didukung untuk pernyataan MERGE.

  • Kueri yang berisi pernyataan DML tidak dapat menggunakan tabel karakter pengganti sebagai target kueri. Misalnya, tabel karakter pengganti dapat digunakan dalam klausa FROM dari kueri UPDATE, tetapi tabel karakter pengganti tidak dapat digunakan sebagai target operasi UPDATE.

Langkah selanjutnya

  • Untuk informasi dan contoh sintaksis DML, lihat Sintaksis DML.
  • Untuk informasi tentang penggunaan pernyataan DML dalam kueri terjadwal, lihat Menjadwalkan kueri.