Statistik DML yang dipartisi aktif

Bahasa Manipulasi Data (DML) yang dipartisi aktif memberikan progres real time untuk DML yang dipartisi yang saat ini aktif di database Anda.

Spanner menyediakan tabel bawaan, SPANNER_SYS.ACTIVE_PARTITIONED_DMLS, yang mencantumkan DML berpartisi yang sedang berjalan dan progres yang dibuat di dalamnya.

Dalam artikel ini, kita akan menjelaskan tabel secara mendetail, menunjukkan beberapa contoh kueri yang menggunakan tabel ini, dan terakhir, menunjukkan cara menggunakan kueri ini untuk membantu memitigasi masalah yang disebabkan oleh DML berpartisi aktif.

Ketersediaan

Data SPANNER_SYS hanya tersedia melalui antarmuka SQL; misalnya:

Metode baca tunggal lainnya yang disediakan Spanner tidak mendukung SPANNER_SYS.

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS menampilkan daftar DML yang dipartisi aktif yang diurutkan berdasarkan waktu mulainya.

Skema tabel

Berikut ini skema tabel untuk SPANNER_SYS.ACTIVE_PARTITIONED_DMLS.

Nama kolom Jenis Deskripsi
TEXT STRING Teks pernyataan kueri DML yang dipartisi.
TEXT_FINGERPRINT INT64 Sidik jari adalah hash dari teks DML yang dipartisi.
SESSION_ID STRING ID sesi yang menjalankan DML yang dipartisi. Menghapus ID sesi akan membatalkan kueri.
NUM_PARTITIONS_TOTAL INT64 Jumlah total partisi dalam DML yang dipartisi.
NUM_PARTITIONS_COMPLETE INT64 Jumlah partisi yang telah diselesaikan oleh DML yang dipartisi.
NUM_TRIVIAL_PARTITIONS_COMPLETE INT64 Jumlah partisi lengkap yang tidak memproses baris apa pun.
PROGRESS DOUBLE Progres DML berpartisi dihitung sebagai jumlah partisi non-trivial yang telah selesai dibagi dengan jumlah total partisi non-trivial.
ROWS_PROCESSED INT64 Jumlah baris yang diproses sejauh ini, diperbarui setelah setiap partisi selesai.
START_TIMESTAMP. TIMESTAMP Batas atas waktu mulai DML yang dipartisi.
LAST_UPDATE_TIMESTAMP TIMESTAMP Stempel waktu terakhir saat DML berpartisi membuat progres. Diperbarui setelah partisi selesai.

Contoh kueri

Anda dapat menjalankan contoh pernyataan SQL berikut menggunakan library klien, Google Cloud CLI, atau konsol Google Cloud.

Mencantumkan kueri terlama yang sedang berjalan

Kueri berikut menampilkan daftar DML yang dipartisi dan sedang berjalan yang diurutkan berdasarkan waktu mulai kueri.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC;
teks biasa session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete progres rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50,00% 2398654 21-01-2024 15.56.30.498744-08.00 22-01-2024 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00,00% 0 22-01-2024 15:55:18.498744-08:00 22-01-2024 15:56:28.049799-08:00
DELETE from Singers WHERE SingerId > 1000000 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20,00% 238654 22-01-2024 15.56.30.498744-08.00 22-01-2024 15:56:19.049799-08:00
UPDATE Singers SET MarketingBudget = 1000 WHERE true 036097a9-91d4-566a-a399-20c754eabdc2 8 5 0 62,50% 238654 22-01-2024 15.57.47.498744-08.00 22-01-2024 15.57.39.049799-08.00

Batasan

Penggunaan tabel SPANNER_SYS.ACTIVE_PARTITIONED_DMLS memiliki batasan berikut:

  • Hasil PROGRESS, ROWS_PROCESSED, dan LAST_UPDATE_TIMESTAMP ditingkatkan pada batas partisi yang telah selesai sehingga DML yang dipartisi mungkin terus memperbarui baris saat nilai di ketiga kolom ini tetap sama.

  • Jika ada jutaan partisi dalam DML yang dipartisi, nilai dalam kolom PROGRESS mungkin tidak menangkap semua progres inkremental. Gunakan NUM_PARTITIONS_COMPLETE dan NUM_TRIVIAL_PARTITIONS_COMPLETE untuk merujuk progres perincian yang lebih baik.

  • Jika Anda membatalkan DML berpartisi menggunakan permintaan RPC, DML berpartisi yang dibatalkan mungkin masih muncul dalam tabel. Jika Anda membatalkan DML berpartisi menggunakan penghapusan sesi, DML akan segera dihapus dari tabel. Untuk mengetahui informasi selengkapnya, lihat Menghapus ID sesi.

Menggunakan data kueri DML yang dipartisi aktif untuk memecahkan masalah penggunaan CPU yang tinggi

Statistik kueri dan statistik transaksi memberikan informasi yang berguna saat memecahkan masalah latensi di database Spanner. Alat ini memberikan informasi tentang kueri yang sudah selesai. Namun, terkadang Anda perlu mengetahui apa yang sedang berjalan di sistem. Misalnya, pertimbangkan skenario saat penggunaan CPU tinggi dan Anda ingin menjawab pertanyaan berikut.

  • Berapa banyak DML yang dipartisi yang sedang berjalan saat ini?
  • Apa yang dimaksud dengan DML yang dipartisi ini?
  • Berapa banyak DML yang dipartisi tersebut yang berjalan dalam waktu lama?
  • Sesi mana yang menjalankan kueri?

Jika memiliki jawaban untuk pertanyaan sebelumnya, Anda dapat memutuskan untuk mengambil tindakan berikut.

  • Hapus sesi yang menjalankan kueri untuk resolusi langsung.
  • Mengurangi frekuensi DML yang dipartisi.

Dalam panduan berikut, kita akan memeriksa DML partisi aktif dan menentukan tindakan yang harus diambil, jika ada.

Mengambil ringkasan DML yang dipartisi aktif

Dalam contoh skenario, kami melihat penggunaan CPU yang lebih tinggi dari biasanya, jadi kami memutuskan untuk menjalankan kueri berikut untuk menampilkan jumlah DML partisi aktif.

SELECT count(*) as active_count
FROM spanner_sys.active_partitioned_dmls;

Kueri menghasilkan hasil berikut.

active_count
22

Mencantumkan 2 DML berpartisi terlama yang berjalan

Kemudian, kita dapat menjalankan kueri untuk menemukan informasi selengkapnya tentang 2 DML berpartisi yang paling lama berjalan dan diurutkan berdasarkan waktu mulai DML berpartisi.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC LIMIT 2;
teks biasa session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete progres rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50,00% 2398654 21-01-2024 15.56.30.498744-08.00 22-01-2024 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00,00% 0 22-01-2024 15:55:18.498744-08:00 22-01-2024 15:56:28.049799-08:00

Membatalkan kueri yang mahal

Kami menemukan DML yang dipartisi yang telah berjalan selama berhari-hari dan tidak mengalami progres. Oleh karena itu, kita dapat menjalankan perintah gcloud spanner databases sessions delete berikut untuk menghapus sesi menggunakan ID sesi yang membatalkan DML berpartisi.

gcloud spanner databases sessions delete\
   5bd37a99-200c-5d2e-9021-15d0dbbd97e6 \
    --database=singer_db --instance=test-instance

Langkah selanjutnya