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:
Halaman Spanner Studio database di konsol Google Cloud
Perintah
gcloud spanner databases execute-sql
executeQuery
API
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
, danLAST_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. GunakanNUM_PARTITIONS_COMPLETE
danNUM_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
- Pelajari Alat introspeksi lainnya.
- Pelajari informasi lain yang disimpan Spanner untuk setiap database di tabel skema informasi database.
- Pelajari lebih lanjut praktik terbaik SQL untuk Spanner.