Kueri aktif terlama, yang juga dikenal sebagai kueri yang berjalan paling lama, adalah daftar kueri yang aktif di database Anda, yang diurutkan berdasarkan berapa lama kueri tersebut berjalan. Memperoleh insight tentang kueri ini dapat membantu mengidentifikasi penyebab latensi sistem dan penggunaan CPU yang tinggi saat terjadi.
Spanner menyediakan tabel bawaan,SPANNER_SYS.OLDEST_ACTIVE_QUERIES
,
yang mencantumkan kueri yang sedang berjalan, termasuk kueri yang berisi pernyataan DML, yang diurutkan
berdasarkan waktu mulai, dalam urutan menaik. Fitur ini tidak mencakup kueri aliran perubahan.
Jika ada banyak kueri yang berjalan, hasilnya mungkin
dibatasi untuk sebagian dari total kueri karena batasan memori yang diterapkan sistem
pada pengumpulan data ini. Oleh karena itu, Spanner menyediakan tabel tambahan, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
, yang menampilkan statistik ringkasan untuk semua kueri aktif (kecuali untuk kueri aliran perubahan).
Anda dapat mengambil informasi dari kedua tabel bawaan ini menggunakan pernyataan SQL.
Dalam dokumen ini, kita akan menjelaskan kedua tabel, menampilkan beberapa contoh kueri yang menggunakan tabel ini, dan terakhir, menunjukkan cara menggunakannya untuk membantu memitigasi masalah yang disebabkan oleh kueri 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
.
OLDEST_ACTIVE_QUERIES
SPANNER_SYS.OLDEST_ACTIVE_QUERIES
menampilkan daftar kueri aktif yang diurutkan berdasarkan
waktu mulai. Jika ada banyak kueri yang berjalan, hasilnya mungkin dibatasi untuk sebagian dari total kueri karena batasan memori
yang diterapkan Spanner pada pengumpulan data ini. Untuk
melihat statistik ringkasan semua kueri aktif, lihat
ACTIVE_QUERIES_SUMMARY
.
Skema tabel
Nama kolom | Jenis | Deskripsi |
---|---|---|
START_TIME |
TIMESTAMP |
Waktu mulai kueri. |
TEXT_FINGERPRINT |
INT64 |
Sidik jari adalah hash dari operasi yang terlibat dalam transaksi. |
TEXT |
STRING |
Teks pernyataan kueri. |
TEXT_TRUNCATED |
BOOL |
Benar jika teks kueri di kolom TEXT terpotong; Jika tidak, salah. |
SESSION_ID |
STRING |
ID sesi yang menjalankan kueri. Ini digunakan untuk kemampuan observasi. |
QUERY_ID . |
STRING |
ID untuk kueri. Anda menggunakan ID ini dengan CALL cancel_query(query_id) untuk membatalkan kueri. |
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 kueri terlama yang sedang berjalan yang diurutkan berdasarkan waktu mulai kueri.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
start_time | text_fingerprint | teks biasa | text_truncated | session_id |
---|---|---|---|---|
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | Salah | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw |
2020-07-18T07:54:08.622081Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Salah | ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ |
2020-07-18T07:54:08.631744Z | -105437553161169030 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 7 LIMIT 1000000; | Salah | ACjbPvanq3MesDNT98t64KdKAz3TlDZoCC-zgW-FJn91cJHuczQ_cOFN_Hdflw |
2020-07-18T07:54:08.720011Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Salah | ACjbPvYIE2QHkhnmMXuAGpB4inK7yMnQjmYgQ9FoygKNaB5KCXu7Sf7f9aghYw |
2020-07-18T07:54:08.731006Z | 6561582859583559006 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 10 LIMIT 1000000; | Salah | ACjbPvYNZ06N2YyvwV0YMlSRBNDtXBqZEK-iAAyPFnFcTmshPvzWkhr034ud7w |
Mencantumkan 2 kueri terlama yang berjalan
Sedikit variasi pada kueri sebelumnya, contoh ini menampilkan 2 kueri berjalan terlama teratas yang diurutkan berdasarkan waktu mulai kueri.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 2;
Output kueri
start_time | text_fingerprint | teks biasa | text_truncated | session_id |
---|---|---|---|---|
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | Salah | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw |
2020-07-18T07:54:08.622081Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Salah | ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ |
ACTIVE_QUERIES_SUMMARY
Seperti namanya, tabel bawaan, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
,
menampilkan statistik ringkasan untuk semua kueri aktif. Seperti yang ditunjukkan dalam skema
berikut, kueri dikelompokkan menurut usia ke dalam tiga bucket, atau penghitung, - lebih lama dari
satu detik, lebih lama dari 10 detik, dan lebih lama dari 100 detik.
Skema tabel
Nama kolom | Jenis | Deskripsi |
---|---|---|
ACTIVE_COUNT |
INT64 |
Jumlah total kueri yang berjalan. |
OLDEST_START_TIME |
TIMESTAMP |
Batas atas waktu mulai kueri terlama yang berjalan. |
COUNT_OLDER_THAN_1S |
INT64 |
Jumlah kueri yang lebih lama dari 1 detik. |
COUNT_OLDER_THAN_10S |
INT64 |
Jumlah kueri yang lebih lama dari 10 detik. |
COUNT_OLDER_THAN_100S |
INT64 |
Jumlah kueri yang lebih lama dari 100 detik. |
Kueri dapat dihitung di lebih dari satu bucket ini. Misalnya, jika
kueri telah berjalan selama 12 detik, kueri tersebut akan dihitung dalam
COUNT_OLDER_THAN_1S
dan COUNT_OLDER_THAN_10S
karena memenuhi kedua
kriteria.
Contoh kueri
Anda dapat menjalankan contoh pernyataan SQL berikut menggunakan library klien, gcloud spanner, atau konsol Google Cloud.
Mengambil ringkasan kueri aktif
Kueri berikut menampilkan statistik ringkasan tentang kueri yang sedang berjalan.
SELECT active_count,
oldest_start_time,
count_older_than_1s,
count_older_than_10s,
count_older_than_100s
FROM spanner_sys.active_queries_summary;
Output kueri
active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
---|---|---|---|---|
22 | 2020-07-18T07:52:28.225877Z | 21 | 21 | 1 |
Batasan
Meskipun tujuannya adalah memberi Anda insight yang paling komprehensif, ada beberapa situasi saat kueri tidak disertakan dalam data yang ditampilkan dalam tabel ini.
Kueri DML (UPDATE/INSERT/DELETE) tidak disertakan jika berada dalam fase Terapkan mutasi.
Kueri tidak disertakan jika sedang dalam proses memulai ulang karena error sementara.
Kueri dari server yang kelebihan beban atau tidak responsif tidak disertakan.
OLDEST_ACTIVE_QUERIES
tidak dapat digunakan dalam transaksi baca-tulis. Bahkan dalam transaksi hanya baca, transaksi ini mengabaikan stempel waktu transaksi dan selalu menampilkan data saat ini sejak dieksekusi. Dalam kasus yang jarang terjadi, kueri ini dapat menampilkan errorABORTED
dengan hasil sebagian; dalam hal ini, hapus hasil sebagian dan coba kueri lagi.
Menggunakan data kueri 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 telah selesai. Namun, terkadang Anda perlu mengetahui apa yang sedang berjalan di sistem. Misalnya, pertimbangkan skenario saat penggunaan CPU cukup tinggi dan Anda ingin menjawab pertanyaan berikut.
- Berapa jumlah kueri yang sedang berjalan saat ini?
- Apa yang dimaksud dengan kueri ini?
- Berapa banyak kueri yang berjalan dalam waktu lama, yaitu lebih dari 100 detik?
- Sesi mana yang menjalankan kueri?
Dengan jawaban atas pertanyaan sebelumnya, Anda dapat memutuskan untuk mengambil tindakan berikut.
- Hapus sesi yang menjalankan kueri untuk resolusi langsung.
- Tingkatkan performa kueri dengan menambahkan indeks.
- Kurangi frekuensi kueri jika terkait dengan tugas latar belakang berkala.
- Identifikasi pengguna atau komponen yang mengeluarkan kueri yang mungkin tidak diberi otorisasi untuk menjalankan kueri.
Dalam panduan ini, kita akan memeriksa kueri aktif dan menentukan tindakan yang perlu diambil, jika ada.
Mengambil ringkasan kueri aktif
Dalam contoh skenario, kami melihat penggunaan CPU yang lebih tinggi dari biasanya, jadi kami memutuskan untuk menjalankan kueri berikut untuk menampilkan ringkasan kueri aktif.
SELECT active_count,
oldest_start_time,
count_older_than_1s,
count_older_than_10s,
count_older_than_100s
FROM spanner_sys.active_queries_summary;
Kueri ini menghasilkan hasil berikut.
active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
---|---|---|---|---|
22 |
2020-07-18T07:52:28.225877Z |
21 |
21 |
1 |
Ternyata kita memiliki satu kueri yang berjalan selama lebih dari 100 detik. Hal ini tidak biasa untuk database kami, jadi kami ingin menyelidikinya lebih lanjut.
Mengambil daftar kueri aktif
Pada langkah sebelumnya, kita telah menentukan bahwa kita memiliki kueri yang berjalan selama lebih dari 100 detik.Untuk menyelidiki lebih lanjut, kita menjalankan kueri berikut untuk menampilkan informasi selengkapnya tentang 5 kueri terlama yang berjalan.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id,
query_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;
Dalam contoh ini, kami menjalankan kueri pada 28 Maret 2024 sekitar pukul 16.44.09 EDT dan menampilkan hasil berikut. (Anda mungkin perlu men-scroll secara horizontal untuk melihat seluruh output.)
start_time | text_fingerprint | teks biasa | text_truncated | session_id | query_id |
---|---|---|---|---|---|
28-03-2024 16:44:09.356939+00:00 | -2833175298673875968 | select * from spanner_sys.oldest_active_queries | false | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw | 37190103859320827 |
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | false | ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ | 48946620525959556 |
Kueri terlama (sidik jari = -2833175298673875968
) ditandai dalam
tabel. Ini adalah CROSS JOIN
yang mahal. Kami memutuskan untuk mengambil tindakan.
Membatalkan kueri yang mahal
Dalam contoh ini, kami menemukan kueri yang menjalankan CROSS JOIN
yang mahal sehingga
kami memutuskan untuk membatalkan kueri. Hasil kueri yang kami terima di langkah
sebelumnya menyertakan query_id
. Kita dapat menjalankan perintah
CALL cancel_query(query_id)
berikut untuk GoogleSQL dan perintah
spanner.cancel_query(query_id)
untuk PostgreSQL guna
membatalkan kueri.
GoogleSQL
CALL cancel_query(query_id)
PostgreSQL
CALL spanner.cancel_query(query_id)
Misalnya, dalam contoh berikut, pernyataan CALL
membatalkan kueri dengan ID 37190103859320827
:
CALL cancel_query('37190103859320827')
Anda perlu membuat kueri tabel spanner_sys.oldest_active_queries
untuk memverifikasi bahwa
kueri dibatalkan.
Panduan ini menunjukkan cara menggunakan SPANNER_SYS.OLDEST_ACTIVE_QUERIES
dan
SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
untuk menganalisis kueri yang sedang berjalan dan mengambil
tindakan jika perlu pada kueri yang berkontribusi pada penggunaan CPU yang tinggi. Tentu saja, menghindari operasi yang mahal dan mendesain skema yang tepat untuk kasus penggunaan Anda akan selalu lebih murah. Untuk informasi selengkapnya tentang cara membuat pernyataan SQL
yang berjalan secara efisien, lihat Praktik terbaik SQL.
Langkah selanjutnya
- Pelajari Alat introspeksi lainnya.
- Pelajari informasi lain yang disimpan Spanner untuk setiap database dalam tabel skema informasi database.
- Pelajari lebih lanjut praktik terbaik SQL untuk Spanner.