Kueri aktif terlama, juga dikenal sebagai kueri terlama yang berjalan, adalah daftar kueri yang saat ini aktif di database Anda, diurutkan menurut berapa lama kueri tersebut telah berjalan. Mendapatkan insight tentang kueri ini dapat membantu mengidentifikasi penyebab latensi sistem dan tingginya penggunaan CPU saat hal itu 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. Ini tidak mencakup kueri aliran data perubahan.
Jika saat ini ada banyak kueri yang berjalan, hasilnya mungkin
terbatas pada subset dari total kueri karena batasan memori yang diberlakukan 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 data perubahan).
Anda dapat mengambil informasi dari kedua tabel bawaan ini menggunakan pernyataan SQL.
Dalam artikel ini, kami akan menjelaskan kedua tabel tersebut, menampilkan beberapa contoh kueri yang menggunakan tabel tersebut, dan, terakhir, mendemonstrasikan cara menggunakannya untuk membantu mengurangi 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 pembacaan 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 saat ini ada banyak kueri yang berjalan, hasilnya mungkin terbatas pada subkumpulan kueri total karena batasan memori yang diterapkan Spanner pada pengumpulan data ini. Guna melihat statistik ringkasan untuk 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 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 mengeksekusi kueri. Menghapus ID sesi akan 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 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 | 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 terlama yang berjalan dan 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 | 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
,
menunjukkan statistik ringkasan untuk semua kueri yang aktif. Seperti yang ditunjukkan dalam skema berikut, kueri dikelompokkan berdasarkan 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 sedang berjalan. |
OLDEST_START_TIME |
TIMESTAMP |
Batas atas pada 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. |
Sebuah 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 tersebut.
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 cara menjalankan kueri.
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 untuk memberikan insight yang selengkap mungkin, ada beberapa situasi ketika kueri tidak disertakan dalam data yang ditampilkan dalam tabel ini.
Kueri DML (UPDATE/INSERT/DELETE) tidak disertakan jika berada dalam fase Menerapkan 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, kode ini mengabaikan stempel waktu transaksi dan selalu menampilkan data saat ini sejak dieksekusi. Dalam kasus yang jarang terjadi, errorABORTED
mungkin ditampilkan dengan hasil yang tidak lengkap; jika demikian, hapus hasil sebagian itu dan coba lagi kueri.
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-alat ini memberikan informasi tentang kueri yang telah diselesaikan. Namun, terkadang Anda perlu mengetahui apa yang saat ini berjalan di sistem. Misalnya, pertimbangkan skenario saat penggunaan CPU cukup tinggi dan Anda ingin menjawab pertanyaan berikut.
- Berapa banyak kueri yang berjalan saat ini?
- Apa saja kueri ini?
- Berapa banyak kueri yang berjalan untuk waktu yang lama, yaitu, lebih dari 100 detik?
- Sesi manakah yang menjalankan kueri?
Dengan jawaban atas pertanyaan sebelumnya, Anda dapat memutuskan untuk melakukan tindakan berikut.
- Hapus sesi yang menjalankan kueri untuk penyelesaian langsung.
- Tingkatkan performa kueri dengan menambahkan indeks.
- Kurangi frekuensi kueri jika terkait dengan tugas latar belakang berkala.
- Identifikasi pengguna atau komponen yang menerbitkan kueri yang mungkin tidak diizinkan untuk menjalankan kueri.
Dalam panduan ini, kami memeriksa kueri aktif kami dan menentukan tindakan yang akan dilakukan, jika ada.
Mengambil ringkasan kueri yang sedang aktif
Dalam contoh skenario, kita melihat penggunaan CPU yang lebih tinggi daripada biasanya, jadi kita memutuskan untuk menjalankan kueri berikut guna 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 tersebut memberikan 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 saat ini kita memiliki satu kueri yang berjalan selama lebih dari 100 detik. Hal ini tidak biasa untuk database kami, jadi kami ingin menyelidiki lebih lanjut.
Mengambil daftar kueri aktif
Pada langkah sebelumnya, kami menentukan bahwa ada kueri yang berjalan selama lebih dari 100 detik.Untuk menyelidiki lebih lanjut, kami menjalankan kueri berikut untuk menampilkan informasi selengkapnya tentang 5 kueri terlama yang sedang berjalan.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;
Dalam contoh ini, kita menjalankan kueri pada Sabtu 18 Juli 2020 sekitar pukul 00.54.18 PDT dan memberikan hasil berikut. (Anda mungkin perlu men-scroll secara horizontal untuk melihat seluruh output.)
start_time | text_fingerprint | teks | 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; |
False |
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 |
Kueri terlama (sidik jari = -3426560921851907385
) ditandai dalam
tabel. CROSS JOIN
ini mahal. Kami memutuskan untuk mengambil tindakan.
Membatalkan kueri yang mahal
Kami menemukan kueri yang menjalankan CROSS JOIN
yang mahal, jadi kami
memutuskan untuk membatalkan kueri tersebut. Hasil kueri pada langkah sebelumnya menyertakan
session_id
, yang merupakan ID sesi yang mengeksekusi kueri. Oleh karena itu, kita dapat menjalankan perintah gcloud spanner databases sessions delete
berikut untuk menghapus sesi menggunakan ID tersebut yang nantinya akan membatalkan kueri.
gcloud spanner databases sessions delete\
ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw \
--database=singer_db --instance=test-instance
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 diperlukan 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 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 praktik terbaik SQL untuk Spanner lebih lanjut.