Statistik kueri aktif terlama

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:

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 error ABORTED 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