Statistik kueri aktif terlama

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:

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