Statistik DML yang dipartisi aktif

Bahasa Pengolahan Data (DML) yang dipartisi aktif memberikan progres real-time untuk DML yang dipartisi yang aktif di database Anda.

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

Halaman ini menjelaskan tabel secara mendetail, menampilkan beberapa contoh kueri yang menggunakan tabel ini, dan terakhir, menunjukkan cara menggunakan kueri ini untuk membantu mengurangi masalah yang disebabkan oleh DML berpartisi aktif. Informasi di halaman ini berlaku untuk database dialek GoogleSQL dan database dialek PostgreSQL.

Mengakses statistik DML yang dipartisi aktif

Spanner menyediakan statistik DML yang dipartisi aktif dalam skema SPANNER_SYS. Anda dapat menggunakan cara berikut untuk mengakses data SPANNER_SYS:

Metode baca tunggal berikut yang disediakan Spanner tidak mendukung SPANNER_SYS:

  • Melakukan pembacaan yang kuat dari satu baris atau beberapa baris dalam tabel.
  • Melakukan pembacaan basi dari satu baris atau beberapa baris dalam tabel.
  • Membaca dari satu baris atau beberapa baris dalam indeks sekunder.

ACTIVE_PARTITIONED_DMLS

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

Skema tabel

Berikut menunjukkan 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.
PROGRESS DOUBLE Progres DML berpartisi dihitung sebagai jumlah partisi non-trivial yang telah selesai dibagi dengan total jumlah partisi non-trivial.
ROWS_PROCESSED INT64 Jumlah baris yang telah diproses, 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 mengalami kemajuan. Diperbarui setelah partisi selesai.

Contoh kueri

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

Mencantumkan kueri yang berjalan paling lama

Kueri berikut menampilkan daftar DML yang dipartisi yang 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 2024-01-21 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 2024-01-22 15:55:18.498744-08:00 22-01-2024 15.56.28.049799-08:00
DELETE dari Penyanyi WHERE SingerId > 1000000 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20,00% 238654 2024-01-22 15:56:30.498744-08:00 2024-01-22 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 2024-01-22 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 akan ditambah di batas partisi yang telah selesai, sehingga DML yang dipartisi dapat terus memperbarui baris, sementara nilai dalam ketiga kolom ini tetap sama.

  • Jika ada jutaan partisi dalam DML yang dipartisi, nilai dalam kolom PROGRESS mungkin tidak mencakup 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 tersebut akan segera dihapus dari tabel. Untuk mengetahui informasi selengkapnya, lihat Menghapus ID sesi.

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

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

  • Berapa banyak DML yang dipartisi yang 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 Anda memiliki jawaban untuk pertanyaan sebelumnya, Anda dapat memutuskan untuk mengambil tindakan berikut.

  • Hapus sesi yang menjalankan kueri untuk segera menyelesaikan masalah.
  • Mengurangi frekuensi DML yang dipartisi.

Dalam panduan berikut, kita akan memeriksa DML yang dipartisi aktif dan menentukan tindakan apa yang perlu dilakukan, 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 yang dipartisi aktif.

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

Kueri menghasilkan hasil berikut.

active_count
22

Mencantumkan 2 DML yang dipartisi yang berjalan paling lama

Kemudian, kita dapat menjalankan kueri untuk menemukan informasi selengkapnya tentang 2 DML berpartisi yang berjalan paling lama 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 2024-01-21 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 2024-01-22 15:55:18.498744-08:00 22-01-2024 15.56.28.049799-08:00

Membatalkan kueri yang mahal

Kami menemukan DML yang dipartisi telah berjalan selama berhari-hari dan tidak menunjukkan 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 berikutnya