Dokumen ini menjelaskan statistik kueri yang ditawarkan Spanner sebagai tabel bawaan. Anda dapat mengambil statistik dari tabel SPANNER_SYS.QUERY_STATS* menggunakan pernyataan SQL.
Kapan harus menggunakan statistik kueri
Statistik kueri berguna saat Anda perlu menyelidiki masalah performa atau mengoptimalkan kueri di database Spanner. Anda dapat menggunakan statistik kueri untuk menyelidiki penggunaan CPU yang tinggi, memecahkan masalah latensi kueri yang meningkat, atau mengurangi penggunaan memori.
Cara mengakses statistik kueri
Spanner menyediakan statistik kueri dalam skema SPANNER_SYS. Anda dapat menggunakan cara berikut untuk mengakses data SPANNER_SYS:
Halaman Spanner Studio database di konsol Google Cloud .
Perintah
gcloud spanner databases execute-sql.Dasbor Query Insights.
Metode
executeSqlatauexecuteStreamingSql.
Metode baca tunggal berikut yang disediakan Spanner tidak mendukung SPANNER_SYS:
- Melakukan pembacaan kuat dari satu baris atau beberapa baris dalam tabel.
- Melakukan pembacaan usang dari satu baris atau beberapa baris dalam tabel.
- Membaca dari satu baris atau beberapa baris dalam indeks sekunder.
Untuk mengetahui informasi selengkapnya, lihat Metode baca tunggal.
Penggunaan CPU yang dikelompokkan menurut kueri
Tabel berikut melacak kueri dengan penggunaan CPU tertinggi selama jangka waktu tertentu:
SPANNER_SYS.QUERY_STATS_TOP_MINUTE: kueri selama interval 1 menitSPANNER_SYS.QUERY_STATS_TOP_10MINUTE: kueri selama interval 10 menitSPANNER_SYS.QUERY_STATS_TOP_HOUR: kueri selama interval 1 jam
Tabel ini memiliki properti berikut:
Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih dari durasi yang ditentukan oleh nama tabel.
Interval didasarkan pada waktu jam
- Interval 1 menit berakhir pada menit tersebut.
- Interval 10 menit berakhir setiap 10 menit mulai dari jam.
- Interval 1 jam berakhir pada jam tersebut.
Misalnya, pada pukul 11.59.30, interval terbaru yang tersedia untuk kueri SQL adalah:
- 1 menit: 11.58.00–11.58.59
- 10 menit: 11.40.00–11.49.59
- 1 jam: 10.00.00–10.59.59
Spanner mengelompokkan statistik berdasarkan teks kueri SQL. Jika kueri menggunakan parameter kueri, atau jika Spanner secara otomatis mengonversi nilai literal menjadi parameter, Spanner akan mengelompokkan semua eksekusi kueri tersebut ke dalam satu baris. Jika kueri menggunakan literal string yang tidak dapat otomatis dikonversi menjadi parameter, Spanner hanya akan mengelompokkan statistik jika teks kueri lengkapnya identik; jika ada teks yang berbeda, setiap kueri akan muncul sebagai baris terpisah. Untuk DML batch, Spanner menormalisasi batch dengan menghapus duplikat pernyataan identik yang berurutan sebelum membuat sidik jari.
Jika tag permintaan ada, TEXT_FINGERPRINT adalah hash tag permintaan. Jika tidak, nilai ini adalah hash dari nilai
TEXT. Untuk DML yang dipartisi, TEXT_FINGERPRINT selalu merupakan hash dari nilaiTEXT.Setiap baris berisi statistik untuk semua eksekusi kueri SQL tertentu yang statistiknya diambil oleh Spanner selama interval yang ditentukan.
Jika Spanner tidak dapat menyimpan semua kueri yang dijalankan selama interval, sistem akan memprioritaskan kueri dengan penggunaan CPU tertinggi selama interval yang ditentukan.
Kueri yang dilacak mencakup kueri yang selesai, gagal, atau dibatalkan oleh pengguna.
Sebagian statistik dikhususkan untuk kueri yang berjalan, tetapi tidak selesai:
Jumlah eksekusi dan latensi rata-rata dalam detik di semua kueri yang tidak berhasil.
Jumlah eksekusi untuk kueri yang waktu tunggunya habis.
Jumlah eksekusi untuk kueri yang dibatalkan oleh pengguna atau gagal karena masalah konektivitas jaringan.
Semua kolom dalam tabel dapat bernilai null.
Statistik kueri untuk pernyataan DML berpartisi yang dijalankan sebelumnya memiliki properti berikut:
Setiap pernyataan DML yang dipartisi dan berhasil dihitung secara ketat sebagai satu eksekusi. Pernyataan DML yang dipartisi yang gagal, dibatalkan, atau sedang dieksekusi memiliki jumlah eksekusi nol.
Statistik
ALL_FAILED_EXECUTION_COUNT,ALL_FAILED_AVG_LATENCY_SECONDS,CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT, danTIMED_OUT_EXECUTION_COUNTtidak dilacak untuk DML yang dipartisi.Statistik untuk setiap pernyataan DML yang dipartisi yang dijalankan sebelumnya mungkin muncul dalam interval yang berbeda.
SPANNER_SYS.QUERY_STATS_TOP_10MINUTEdanSPANNER_SYS.QUERY_STATS_TOP_HOURmemberikan tampilan gabungan untuk pernyataan DML yang dipartisi yang selesai dalam waktu 10 menit dan 1 jam. Untuk melihat statistik pernyataan yang durasinya lebih dari 1 jam, lihat contoh kueri.
Skema tabel
| Nama kolom | Jenis | Deskripsi | |
|---|---|---|---|
INTERVAL_END |
TIMESTAMP |
Akhir interval waktu terjadinya eksekusi kueri yang disertakan. | |
REQUEST_TAG |
STRING |
Tag permintaan opsional untuk operasi kueri ini. Untuk mengetahui informasi selengkapnya tentang penggunaan tag, lihat Memecahkan masalah dengan tag permintaan. | |
QUERY_TYPE |
STRING |
Menunjukkan apakah kueri adalah PARTITIONED_QUERY atau
QUERY. PARTITIONED_QUERY
adalah kueri dengan partitionToken yang diperoleh dari
API PartitionQuery,
atau pernyataan DML berpartisi. Semua kueri dan pernyataan DML lainnya ditunjukkan oleh jenis kueri QUERY.
|
|
TEXT |
STRING |
Teks kueri SQL, dipotong menjadi sekitar 64 KB.
Statistik untuk beberapa kueri yang memiliki string tag yang sama dikelompokkan dalam satu baris dengan REQUEST_TAG yang cocok
dengan string tag tersebut. Hanya teks dari salah satu kueri tersebut yang ditampilkan di kolom ini, yang dipotong menjadi sekitar 64 KB.
Untuk DML batch, kumpulan pernyataan SQL diratakan menjadi satu baris, yang digabungkan menggunakan pemisah titik koma. Teks SQL yang identik dan berurutan akan dihapus duplikatnya sebelum dipotong.
|
|
TEXT_TRUNCATED |
BOOL |
Apakah teks kueri dipotong atau tidak. | |
TEXT_FINGERPRINT |
INT64 |
Hash nilai REQUEST_TAG jika ada; Jika tidak,
hash nilai TEXT.
Sesuai dengan kolom query_fingerprint di log audit |
|
EXECUTION_COUNT |
INT64 |
Frekuensi Spanner melihat kueri selama interval. | |
AVG_LATENCY_SECONDS |
FLOAT64 |
Durasi rata-rata, dalam detik, untuk setiap eksekusi kueri dalam database. Rata-rata ini tidak termasuk waktu encoding dan transmisi untuk set hasil serta overhead. | |
AVG_ROWS |
FLOAT64 |
Jumlah rata-rata baris yang ditampilkan kueri. | |
AVG_BYTES |
FLOAT64 |
Jumlah rata-rata byte data yang ditampilkan kueri, tidak termasuk overhead encoding transmisi. | |
AVG_ROWS_SCANNED |
FLOAT64 |
Jumlah rata-rata baris yang dipindai kueri, tidak termasuk nilai yang dihapus. | |
AVG_CPU_SECONDS |
FLOAT64 |
Jumlah rata-rata detik waktu CPU yang dihabiskan Spanner untuk semua operasi guna menjalankan kueri. | |
ALL_FAILED_EXECUTION_COUNT |
INT64 |
Frekuensi kegagalan kueri selama interval. | |
ALL_FAILED_AVG_LATENCY_SECONDS |
FLOAT64 |
Durasi rata-rata, dalam detik, untuk setiap eksekusi kueri yang gagal dalam database. Rata-rata ini tidak termasuk waktu encoding dan transmisi untuk set hasil serta overhead. | |
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT |
INT64 |
Frekuensi kueri dibatalkan oleh pengguna atau gagal karena koneksi jaringan terputus selama interval. | |
TIMED_OUT_EXECUTION_COUNT |
INT64 |
Frekuensi waktu kueri habis selama interval. | |
AVG_BYTES_WRITTEN |
FLOAT64 |
Jumlah rata-rata byte yang ditulis oleh pernyataan. | |
AVG_ROWS_WRITTEN |
FLOAT64 |
Jumlah rata-rata baris yang diubah oleh pernyataan. | |
STATEMENT_COUNT |
INT64 |
Jumlah laporan yang digabungkan ke dalam entri ini. Untuk kueri reguler dan DML, jumlah ini sama dengan jumlah eksekusi. Untuk DML batch, Spanner mencatat jumlah pernyataan dalam batch. | |
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT |
INT64 |
Frekuensi kueri dijalankan sebagai bagian dari transaksi baca-tulis. Kolom ini membantu Anda menentukan apakah Anda dapat menghindari pertentangan kunci dengan memindahkan kueri ke transaksi hanya baca. | |
LATENCY_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram waktu eksekusi kueri. Nilai diukur dalam detik.
Array berisi satu elemen dan memiliki jenis berikut:
Untuk menghitung latensi persentil dari distribusi, gunakan fungsi Untuk mengetahui informasi selengkapnya, lihat Persentil dan metrik bernilai distribusi. |
|
AVG_MEMORY_PEAK_USAGE_BYTES |
FLOAT64 |
Selama eksekusi kueri terdistribusi, penggunaan memori puncak rata-rata (dalam byte). Gunakan statistik ini untuk mengidentifikasi kueri atau ukuran data tabel yang kemungkinan akan mencapai batas memori. |
|
AVG_MEMORY_USAGE_PERCENTAGE |
FLOAT64 |
Selama eksekusi kueri terdistribusi, penggunaan memori rata-rata yang diperlukan (sebagai persentase batas memori yang diizinkan untuk kueri ini). Statistik ini hanya melacak memori yang diperlukan agar kueri dapat dijalankan. Beberapa operator menggunakan memori buffering tambahan untuk meningkatkan
performa. Memori buffering tambahan yang digunakan terlihat dalam rencana kueri, tetapi tidak digunakan untuk menghitung Gunakan statistik ini untuk mengidentifikasi kueri yang mendekati batas penggunaan memori dan berisiko gagal jika ukuran data meningkat. Untuk mengurangi risiko kegagalan kueri, lihat praktik terbaik SQL untuk mengoptimalkan kueri ini, atau bagi kueri menjadi beberapa bagian yang membaca lebih sedikit data. |
|
AVG_QUERY_PLAN_CREATION_TIME_SECS |
FLOAT64 |
Waktu CPU rata-rata dalam detik yang dihabiskan untuk kompilasi kueri, termasuk pembuatan runtime kueri. Jika nilai kolom ini tinggi, gunakan kueri berparameter. |
|
AVG_FILESYSTEM_DELAY_SECS |
FLOAT64 |
Waktu rata-rata yang dihabiskan kueri untuk membaca dari sistem file atau diblokir pada input/output (I/O). Gunakan statistik ini untuk mengidentifikasi potensi latensi tinggi yang disebabkan oleh I/O sistem file. Untuk mengatasinya, tambahkan indeks
atau tambahkan klausa |
|
AVG_REMOTE_SERVER_CALLS |
FLOAT64 |
Jumlah rata-rata panggilan server jarak jauh (RPC) yang telah diselesaikan oleh kueri. Gunakan statistik ini untuk mengidentifikasi apakah kueri berbeda yang memindai jumlah baris yang sama memiliki jumlah RPC yang sangat berbeda. Kueri dengan nilai RPC yang lebih tinggi mungkin akan mendapatkan manfaat dari penambahan indeks atau penambahan klausa |
|
AVG_ROWS_SPOOLED |
FLOAT64 |
Jumlah rata-rata baris yang ditulis ke disk sementara (bukan dalam memori) oleh pernyataan kueri. Gunakan statistik ini untuk mengidentifikasi kueri yang berpotensi memiliki latensi tinggi, yang memerlukan banyak memori, dan tidak dapat dieksekusi dalam memori. Untuk mengatasinya,
ubah urutan |
|
AVG_DISK_IO_COST |
FLOAT64 |
Biaya rata-rata kueri ini dalam hal pemuatan disk HDD Spanner. Gunakan nilai ini untuk membuat perbandingan biaya I/O HDD relatif antara pembacaan yang Anda jalankan di database. Membuat kueri data di penyimpanan HDD akan dikenai biaya terhadap kapasitas pemuatan disk HDD instance. Nilai yang lebih tinggi menunjukkan bahwa Anda menggunakan lebih banyak beban disk HDD dan kueri Anda mungkin lebih lambat daripada jika dijalankan di SSD. Selain itu, jika beban disk HDD Anda mencapai kapasitas, performa kueri Anda mungkin akan lebih terpengaruh. Anda dapat memantau total kapasitas beban disk HDD instance sebagai persentase. Untuk menambahkan lebih banyak kapasitas beban disk HDD, Anda dapat menambahkan lebih banyak unit pemrosesan atau node ke instance. Untuk mengetahui informasi selengkapnya, lihat Mengubah kapasitas komputasi. Untuk meningkatkan performa kueri, pertimbangkan juga untuk memindahkan beberapa data ke SSD. Untuk workload yang menggunakan banyak I/O disk, sebaiknya simpan data yang sering diakses di penyimpanan SSD. Data yang diakses dari SSD tidak menggunakan kapasitas pemuatan disk HDD. Anda dapat menyimpan tabel, kolom, atau indeks sekunder tertentu di penyimpanan SSD sesuai kebutuhan, sekaligus menyimpan data yang jarang diakses di penyimpanan HDD. Untuk mengetahui informasi selengkapnya, lihat Ringkasan penyimpanan bertingkat. |
|
LATENCY_DISTRIBUTION_JSON_STRING |
STRING |
Histogram waktu eksekusi kueri. Nilai diukur dalam detik. Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Kolom ini berisi Distribusi. Untuk menghitung latensi persentil dari distribusi, gunakan fungsi Untuk informasi selengkapnya, lihat Persentil dan metrik bernilai distribusi. |
|
AVG_COLUMNAR_READ_SHARE |
FLOAT64 |
Persentase rata-rata byte yang dibaca dari penyimpanan berbasis kolom dari total byte yang dibaca dari penyimpanan berbasis baris dan kolom, yang dinyatakan sebagai pecahan antara 0 dan 1. Gunakan statistik ini untuk memantau penggunaan columnar engine dalam kueri. Untuk mengetahui informasi selengkapnya, lihat Memantau performa columnar engine. |
|
QUERY_OPTIMIZER_VERSIONS |
ARRAY<INT64> |
Versi pengoptimal kueri yang digunakan untuk kueri dalam periode waktu ini. |
|
STATISTICS_PACKAGE_NAMES |
ARRAY<STRING> |
Nama paket statistik yang digunakan untuk kueri dalam periode waktu ini. |
|
CPU_SECONDS_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram waktu CPU yang digunakan Spanner di semua operasi untuk menjalankan kueri. Nilai diukur dalam detik.
Array memiliki struktur berikut:
Untuk mengetahui informasi selengkapnya tentang jenis nilai, lihat Distribution dan Exponential. Untuk menghitung persentil detik CPU dari distribusi, gunakan fungsi |
|
CPU_SECONDS_DISTRIBUTION_JSON_STRING |
STRING |
Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Untuk menghitung persentil detik CPU dari distribusi, gunakan fungsi |
|
ROW_SCANNED_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram jumlah baris yang dipindai oleh kueri, tidak termasuk nilai yang dihapus.
Array memiliki struktur berikut:
Untuk mengetahui informasi selengkapnya tentang jenis nilai, lihat Distribution dan Exponential. Untuk menghitung persentil baris yang dipindai dari distribusi, gunakan fungsi |
|
ROW_SCANNED_DISTRIBUTION_JSON_STRING |
STRING |
Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Untuk menghitung persentil baris yang dipindai dari distribusi, gunakan fungsi |
EXECUTION_COUNT, AVG_LATENCY_SECONDS, LATENCY_DISTRIBUTION,
dan LATENCY_DISTRIBUTION_JSON_STRING untuk kueri yang gagal
mencakup kueri yang gagal karena sintaksis yang salah atau mengalami
error sementara, tetapi berhasil saat dicoba lagi. Statistik ini tidak melacak pernyataan DML berpartisi yang gagal dan dibatalkan.
Statistik gabungan
Ada juga tabel yang melacak data gabungan untuk semua kueri yang statistiknya diambil oleh Spanner dalam jangka waktu tertentu:
SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: Kueri selama interval 1 menitSPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: Kueri selama interval 10 menitSPANNER_SYS.QUERY_STATS_TOTAL_HOUR: Kueri selama interval 1 jam
Tabel ini memiliki properti berikut:
Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih dengan durasi yang ditentukan oleh nama tabel.
Interval didasarkan pada waktu jam. Interval 1 menit berakhir pada menit, interval 10 menit berakhir setiap 10 menit mulai dari jam, dan interval 1 jam berakhir pada jam.
Misalnya, pada pukul 11.59.30, interval terbaru yang tersedia untuk kueri SQL adalah:
- 1 menit: 11.58.00–11.58.59
- 10 menit: 11.40.00–11.49.59
- 1 jam: 10.00.00–10.59.59
Setiap baris berisi statistik untuk semua kueri yang dijalankan di database selama interval yang ditentukan, yang digabungkan bersama. Hanya ada satu baris per interval waktu dan mencakup kueri yang selesai, kueri yang gagal, dan kueri yang dibatalkan oleh pengguna.
Statistik yang diambil dalam tabel
TOTALmungkin mencakup kueri yang tidak diambil Spanner dalam tabelTOP.Beberapa kolom dalam tabel ini ditampilkan sebagai metrik di Cloud Monitoring. Metrik yang ditampilkan adalah:
- Jumlah eksekusi kueri
- Kegagalan kueri
- Latensi kueri
- Jumlah baris yang ditampilkan
- Jumlah baris yang dipindai
- Jumlah byte yang ditampilkan
- Waktu CPU kueri
Untuk mengetahui informasi selengkapnya, lihat Metrik Spanner.
Skema tabel
| Nama kolom | Jenis | Deskripsi |
|---|---|---|
INTERVAL_END |
TIMESTAMP |
Akhir interval waktu terjadinya eksekusi kueri yang disertakan. |
EXECUTION_COUNT |
INT64 |
Frekuensi Spanner melihat kueri selama interval waktu. |
AVG_LATENCY_SECONDS |
FLOAT64 |
Durasi rata-rata, dalam detik, untuk setiap eksekusi kueri dalam database. Rata-rata ini tidak termasuk waktu encoding dan transmisi untuk set hasil serta overhead. |
AVG_ROWS |
FLOAT64 |
Jumlah rata-rata baris yang ditampilkan kueri. |
AVG_BYTES |
FLOAT64 |
Jumlah rata-rata byte data yang ditampilkan kueri, tidak termasuk overhead encoding transmisi. |
AVG_ROWS_SCANNED |
FLOAT64 |
Jumlah rata-rata baris yang dipindai kueri, tidak termasuk nilai yang dihapus. |
AVG_CPU_SECONDS |
FLOAT64 |
Jumlah rata-rata detik waktu CPU yang dihabiskan Spanner untuk semua operasi guna menjalankan kueri. |
ALL_FAILED_EXECUTION_COUNT |
INT64 |
Frekuensi kegagalan kueri selama interval. |
ALL_FAILED_AVG_LATENCY_SECONDS |
FLOAT64 |
Durasi rata-rata, dalam detik, untuk setiap eksekusi kueri yang gagal dalam database. Rata-rata ini tidak termasuk waktu encoding dan transmisi untuk set hasil serta overhead. |
CANCELLED_OR_DISCONNECTED_EXECUTION_COUNT |
INT64 |
Frekuensi kueri dibatalkan oleh pengguna atau gagal karena koneksi jaringan terputus selama interval. |
TIMED_OUT_EXECUTION_COUNT |
INT64 |
Frekuensi waktu kueri habis selama interval. |
AVG_BYTES_WRITTEN |
FLOAT64 |
Jumlah rata-rata byte yang ditulis oleh pernyataan. |
AVG_ROWS_WRITTEN |
FLOAT64 |
Jumlah rata-rata baris yang diubah oleh pernyataan. |
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT |
INT64 |
Frekuensi kueri dijalankan sebagai bagian dari transaksi baca-tulis. Kolom ini membantu Anda menentukan apakah Anda dapat menghindari pertentangan kunci dengan memindahkan beberapa kueri ke transaksi hanya baca. |
LATENCY_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram waktu eksekusi di seluruh kueri. Nilai diukur dalam detik.
Tentukan array sebagai berikut:
Untuk menghitung latensi persentil dari distribusi, gunakan fungsi Untuk mengetahui informasi selengkapnya, lihat Persentil dan metrik bernilai distribusi. |
LATENCY_DISTRIBUTION_JSON_STRING |
STRING |
Histogram waktu eksekusi kueri. Nilai diukur dalam detik. Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Kolom ini berisi Distribusi. Untuk menghitung latensi persentil dari distribusi, gunakan fungsi Untuk informasi selengkapnya, lihat Persentil dan metrik bernilai distribusi. |
AVG_COLUMNAR_READ_SHARE |
FLOAT64 |
Persentase rata-rata byte yang dibaca dari penyimpanan berbasis kolom dari total byte yang dibaca dari penyimpanan berbasis baris dan kolom, yang dinyatakan sebagai pecahan antara 0 dan 1. Gunakan statistik ini untuk memantau penggunaan columnar engine dalam kueri. Untuk mengetahui informasi selengkapnya, lihat Memantau performa columnar engine. |
CPU_SECONDS_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram waktu CPU yang digunakan Spanner di semua operasi untuk menjalankan kueri. Nilai diukur dalam detik.
Array memiliki struktur berikut:
Untuk mengetahui informasi selengkapnya tentang jenis nilai, lihat Distribusi dan Eksponensial. Untuk menghitung persentil detik CPU dari distribusi, gunakan fungsi |
CPU_SECONDS_DISTRIBUTION_JSON_STRING |
STRING |
Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Untuk menghitung persentil detik CPU dari distribusi, gunakan fungsi |
ROW_SCANNED_DISTRIBUTION |
ARRAY<STRUCT> |
Histogram jumlah baris yang dipindai oleh kueri, tidak termasuk nilai yang dihapus.
Array memiliki struktur berikut:
Untuk mengetahui informasi selengkapnya tentang jenis nilai, lihat Distribution dan Exponential. Untuk menghitung persentil baris yang dipindai dari distribusi, gunakan fungsi |
ROW_SCANNED_DISTRIBUTION_JSON_STRING |
STRING |
Representasi string yang kompatibel dengan JSON dari statistik Kolom ini didukung dalam database dialek GoogleSQL dan dialek PostgreSQL. Untuk menghitung persentil baris yang dipindai dari distribusi, gunakan fungsi |
Retensi data
Setidaknya, Spanner menyimpan data untuk setiap tabel selama jangka waktu berikut:
SPANNER_SYS.QUERY_STATS_TOP_MINUTEdanSPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: Interval yang mencakup 6 jam sebelumnya.SPANNER_SYS.QUERY_STATS_TOP_10MINUTEdanSPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: Interval yang mencakup 4 hari sebelumnya.SPANNER_SYS.QUERY_STATS_TOP_HOURdanSPANNER_SYS.QUERY_STATS_TOTAL_HOUR: Interval yang mencakup 30 hari sebelumnya.
Contoh kueri
Bagian ini mencakup beberapa contoh pernyataan SQL yang mengambil statistik kueri. Anda dapat menjalankan pernyataan SQL ini menggunakan library klien, Google Cloud CLI, atau konsolGoogle Cloud .
Mencantumkan statistik dasar untuk setiap kueri dalam jangka waktu tertentu
Kueri berikut menampilkan data mentah untuk kueri teratas dalam menit sebelumnya:
SELECT text,
request_tag,
interval_end,
execution_count,
avg_latency_seconds,
avg_rows,
avg_bytes,
avg_rows_scanned,
avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
ORDER BY interval_end DESC;
Mencantumkan statistik untuk pernyataan DML yang dipartisi yang berjalan lebih dari satu jam
Kueri berikut menampilkan jumlah eksekusi dan baris rata-rata yang ditulis oleh kueri DML yang dipartisi teratas dalam jam sebelumnya:
SELECT text,
request_tag,
interval_end,
sum(execution_count) as execution_count,
sum(avg_rows_written*execution_count)/sum(execution_count) as avg_rows_written
FROM spanner_sys.query_stats_top_hour
WHERE starts_with(text, "UPDATE") AND query_type = "PARTITIONED_QUERY"
group by text, request_tag, interval_end
ORDER BY interval_end DESC;
Mencantumkan kueri dengan penggunaan CPU tertinggi
Kueri berikut menampilkan kueri dengan penggunaan CPU tertinggi dalam satu jam sebelumnya:
SELECT text,
request_tag,
execution_count AS count,
avg_latency_seconds AS latency,
avg_cpu_seconds AS cpu,
execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;
Menemukan total jumlah eksekusi dalam jangka waktu tertentu
Kueri berikut menampilkan jumlah total kueri yang dieksekusi dalam interval 1 menit lengkap terbaru:
SELECT interval_end,
execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_total_minute);
Menemukan latensi rata-rata untuk kueri
Kueri berikut menampilkan informasi latensi rata-rata untuk kueri tertentu:
SELECT avg_latency_seconds
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "SELECT x FROM table WHERE x=@foo;";
Menemukan latensi persentil ke-99 untuk kueri
Membandingkan latensi rata-rata dengan latensi persentil ke-99 membantu mengidentifikasi kemungkinan kueri pencilan dengan waktu eksekusi yang tinggi.
Kueri berikut menampilkan persentil ke-99 waktu eksekusi di seluruh kueri yang dijalankan dalam 10 menit sebelumnya.
Untuk database dialek GoogleSQL, Anda dapat menggunakan kolom LATENCY_DISTRIBUTION:
SELECT interval_end, avg_latency_seconds, SPANNER_SYS.DISTRIBUTION_PERCENTILE(latency_distribution[OFFSET(0)], 99.0)
AS percentile_latency
FROM spanner_sys.query_stats_total_10minute
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_total_10minute)
ORDER BY interval_end;
Untuk database dialek PostgreSQL, gunakan kolom LATENCY_DISTRIBUTION_JSON_STRING:
SELECT interval_end, avg_latency_seconds, SPANNER_SYS.DISTRIBUTION_PERCENTILE(latency_distribution_json_string, 99.0)
AS percentile_latency
FROM spanner_sys.query_stats_total_10minute
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_total_10minute)
ORDER BY interval_end;
Menemukan kueri yang memindai data terbanyak
Anda dapat menggunakan jumlah baris yang dipindai oleh kueri sebagai ukuran jumlah data yang dipindai kueri. Kueri berikut menampilkan jumlah baris yang dipindai oleh kueri yang dieksekusi dalam satu jam sebelumnya:
SELECT text,
execution_count,
avg_rows_scanned
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_scanned DESC;
Menemukan pernyataan yang menulis data terbanyak
Anda dapat menggunakan jumlah baris yang ditulis (atau byte yang ditulis) oleh DML sebagai ukuran jumlah data yang diubah oleh kueri. Kueri berikut menampilkan jumlah baris yang ditulis oleh pernyataan DML yang dieksekusi dalam satu jam sebelumnya:
SELECT text,
execution_count,
avg_rows_written
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_written DESC;
Menjumlahkan penggunaan CPU di semua kueri
Kueri berikut menampilkan jumlah jam CPU yang digunakan pada jam sebelumnya:
SELECT (avg_cpu_seconds * execution_count / 60 / 60)
AS total_cpu_hours
FROM spanner_sys.query_stats_total_hour
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_total_hour);
Mencantumkan kueri yang gagal dalam jangka waktu tertentu
Kueri berikut menampilkan data mentah, termasuk jumlah eksekusi dan latensi rata-rata kueri yang gagal untuk kueri teratas pada menit sebelumnya. Statistik ini tidak melacak pernyataan DML yang dipartisi yang gagal dan dibatalkan.
SELECT text,
request_tag,
interval_end,
execution_count,
all_failed_execution_count,
all_failed_avg_latency_seconds,
avg_latency_seconds,
avg_rows,
avg_bytes,
avg_rows_scanned,
avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;
Menemukan total jumlah error dalam jangka waktu tertentu
Kueri berikut menampilkan jumlah total kueri yang gagal dieksekusi dalam interval 1 menit lengkap terbaru. Statistik ini tidak melacak pernyataan DML yang dipartisi yang gagal dan dibatalkan.
SELECT interval_end,
all_failed_execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_top_minute)
ORDER BY interval_end;
Mencantumkan kueri yang paling sering mengalami waktu tunggu habis
Kueri berikut menampilkan kueri dengan jumlah waktu tunggu tertinggi dalam satu jam sebelumnya.
SELECT text,
execution_count AS count,
timed_out_execution_count AS timeout_count,
avg_latency_seconds AS latency,
avg_cpu_seconds AS cpu,
execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
(SELECT MAX(interval_end)
FROM spanner_sys.query_stats_top_hour)
ORDER BY timed_out_execution_count DESC;
Menemukan latensi rata-rata eksekusi yang berhasil dan gagal untuk kueri
Kueri berikut menampilkan latensi rata-rata gabungan, latensi rata-rata untuk eksekusi yang berhasil, dan latensi rata-rata untuk eksekusi yang gagal untuk kueri tertentu. Statistik ini tidak melacak pernyataan DML yang dipartisi yang gagal dan dibatalkan.
SELECT avg_latency_seconds AS combined_avg_latency,
all_failed_avg_latency_seconds AS failed_execution_latency,
( avg_latency_seconds * execution_count -
all_failed_avg_latency_seconds * all_failed_execution_count
) / (
execution_count - all_failed_execution_count ) AS success_execution_latency
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "select x from table where x=@foo;";
Memecahkan masalah penggunaan CPU yang tinggi atau latensi kueri yang meningkat dengan statistik kueri
Statistik kueri berguna saat Anda perlu menyelidiki penggunaan CPU yang tinggi di database Spanner atau saat Anda hanya mencoba memahami bentuk kueri yang menggunakan banyak CPU di database Anda. Memeriksa kueri yang menggunakan resource database dalam jumlah besar memberi pengguna Spanner cara potensial untuk mengurangi biaya operasional dan mungkin meningkatkan latensi sistem umum.
Anda dapat menggunakan kode SQL atau dasbor Query insights untuk menyelidiki kueri yang bermasalah di database Anda. Topik berikut menunjukkan cara menyelidiki kueri tersebut menggunakan kode SQL.
Meskipun contoh berikut berfokus pada penggunaan CPU, langkah-langkah serupa dapat diikuti untuk memecahkan masalah latensi kueri yang meningkat dan menemukan kueri dengan latensi tertinggi. Pilih interval waktu dan kueri berdasarkan latensi, bukan penggunaan CPU.
Pilih jangka waktu yang akan diselidiki
Mulai investigasi Anda dengan mencari waktu saat aplikasi Anda mulai mengalami penggunaan CPU yang tinggi. Misalnya, jika masalah mulai terjadi sekitar pukul 17.00 pada 24 Juli 2020 UTC.
Mengumpulkan statistik kueri untuk jangka waktu yang dipilih
Setelah memilih jangka waktu untuk memulai investigasi, lihat
statistik yang dikumpulkan dalam tabel QUERY_STATS_TOTAL_10MINUTE sekitar waktu tersebut.
Hasil kueri ini mungkin menunjukkan bagaimana CPU dan statistik kueri lainnya berubah selama jangka waktu tersebut.
Kueri berikut menampilkan statistik kueri gabungan dari 16.30 hingga
17.30 UTC inklusif. Kueri ini menggunakan ROUND untuk membatasi
jumlah tempat desimal untuk tujuan tampilan.
SELECT interval_end,
execution_count AS count,
ROUND(avg_latency_seconds,2) AS latency,
ROUND(avg_rows,2) AS rows_returned,
ROUND(avg_bytes,2) AS bytes,
ROUND(avg_rows_scanned,2) AS rows_scanned,
ROUND(avg_cpu_seconds,3) AS avg_cpu
FROM spanner_sys.query_stats_total_10minute
WHERE
interval_end >= "2020-07-24T16:30:00Z"
AND interval_end <= "2020-07-24T17:30:00Z"
ORDER BY interval_end;
Menjalankan kueri akan menghasilkan hasil berikut.
| interval_end | jumlah | latensi | rows_returned | byte | rows_scanned | avg_cpu |
|---|---|---|---|---|---|---|
| 2020-07-24T16:30:00Z | 6 | 0,06 | 5,00 | 536,00 | 16,67 | 0,035 |
| 2020-07-24T16:40:00Z | 55 | 0,02 | 0,22 | 25,29 | 0,22 | 0,004 |
| 2020-07-24T16:50:00Z | 102 | 0,02 | 0,30 | 33,35 | 0,30 | 0,004 |
2020-07-24T17:00:00Z |
154 |
1.06 |
4.42 |
486.33 |
7792208.12 |
4.633 |
| 2020-07-24T17:10:00Z | 94 | 0,02 | 1,68 | 106,84 | 1,68 | 0,006 |
| 2020-07-24T17:20:00Z | 110 | 0,02 | 0,38 | 34,60 | 0,38 | 0,005 |
| 2020-07-24T17:30:00Z | 47 | 0,02 | 0,23 | 24,96 | 0,23 | 0,004 |
Pada tabel sebelumnya, perhatikan bahwa waktu CPU rata-rata, kolom avg_cpu dalam tabel hasil, adalah yang tertinggi dalam interval yang ditandai yang berakhir pada pukul 17.00. Selain itu, perhatikan jumlah baris yang dipindai rata-rata jauh lebih tinggi. Hal ini menunjukkan bahwa kueri yang lebih mahal dijalankan antara pukul 16.50 dan 17.00. Pilih interval tersebut untuk menyelidiki lebih lanjut di langkah berikutnya.
Menemukan kueri yang menyebabkan penggunaan CPU yang tinggi
Dengan interval waktu yang dipilih untuk diselidiki, buat kueri tabel QUERY_STATS_TOP_10MINUTE. Hasil kueri ini dapat membantu menunjukkan kueri mana yang menyebabkan penggunaan CPU tinggi.
SELECT text_fingerprint AS fingerprint,
execution_count AS count,
ROUND(avg_latency_seconds,2) AS latency,
ROUND(avg_cpu_seconds,3) AS cpu,
ROUND(execution_count * avg_cpu_seconds,3) AS total_cpu
FROM spanner_sys.query_stats_top_10minute
WHERE
interval_end = "2020-07-24T17:00:00Z"
ORDER BY total_cpu DESC;
Menjalankan kueri ini akan memberikan hasil berikut.
| sidik jari | jumlah | latensi | cpu | total_cpu |
|---|---|---|---|---|
5505124206529314852 |
30 |
3.88 |
17.635 |
529.039 |
1697951036096498470 |
10 |
4.49 |
18.388 |
183.882 |
| 2295109096748351518 | 1 | 0,33 | 0,048 | 0,048 |
| 11618299167612903606 | 1 | 0,25 | 0,021 | 0,021 |
| 10302798842433860499 | 1 | 0,04 | 0,006 | 0,006 |
| 123771704548746223 | 1 | 0,04 | 0,006 | 0,006 |
| 4216063638051261350 | 1 | 0,04 | 0,006 | 0,006 |
| 3654744714919476398 | 1 | 0,04 | 0,006 | 0,006 |
| 2999453161628434990 | 1 | 0,04 | 0,006 | 0,006 |
| 823179738756093706 | 1 | 0,02 | 0,005 | 0,0056 |
Dua kueri teratas, yang ditandai dalam tabel hasil, merupakan pencilan dalam hal CPU dan latensi rata-rata, serta jumlah eksekusi dan total CPU. Selidiki kueri pertama yang tercantum dalam hasil ini.
Membandingkan operasi kueri dari waktu ke waktu
Setelah mempersempit investigasi, periksa tabel QUERY_STATS_TOP_MINUTE. Dengan membandingkan operasi dari waktu ke waktu untuk kueri tertentu, Anda dapat mencari korelasi antara jumlah baris atau byte yang ditampilkan, atau jumlah baris yang dipindai dan peningkatan CPU atau latensi. Penyimpangan
dapat mengindikasikan ketidakseragaman dalam data. Jumlah baris yang dipindai yang selalu tinggi dapat mengindikasikan kurangnya indeks yang sesuai atau pengurutan gabungan yang kurang optimal.
Selidiki kueri yang menunjukkan penggunaan CPU rata-rata tertinggi dan latensi tertinggi dengan menjalankan pernyataan berikut yang memfilter text_fingerprint kueri tersebut.
SELECT interval_end,
ROUND(avg_latency_seconds,2) AS latency,
avg_rows AS rows_returned,
avg_bytes AS bytes_returned,
avg_rows_scanned AS rows_scanned,
ROUND(avg_cpu_seconds,3) AS cpu,
FROM spanner_sys.query_stats_top_minute
WHERE text_fingerprint = 5505124206529314852
ORDER BY interval_end DESC;
Menjalankan kueri ini akan menampilkan hasil berikut.
| interval_end | latensi | rows_returned | bytes_returned | rows_scanned | cpu |
|---|---|---|---|---|---|
| 2020-07-24T17:00:00Z | 4,55 | 21 | 2365 | 30000000 | 19.255 |
| 2020-07-24T16:00:00Z | 3,62 | 21 | 2365 | 30000000 | 17.255 |
| 2020-07-24T15:00:00Z | 4,37 | 21 | 2365 | 30000000 | 18.350 |
| 2020-07-24T14:00:00Z | 4,02 | 21 | 2365 | 30000000 | 17.748 |
| 2020-07-24T13:00:00Z | 3,12 | 21 | 2365 | 30000000 | 16.380 |
| 2020-07-24T12:00:00Z | 3.45 | 21 | 2365 | 30000000 | 15.476 |
| 2020-07-24T11:00:00Z | 4,94 | 21 | 2365 | 30000000 | 22.611 |
| 2020-07-24T10:00:00Z | 6,48 | 21 | 2365 | 30000000 | 21.265 |
| 2020-07-24T09:00:00Z | 0,23 | 21 | 2365 | 5 | 0,040 |
| 2020-07-24T08:00:00Z | 0,04 | 21 | 2365 | 5 | 0,021 |
| 2020-07-24T07:00:00Z | 0,09 | 21 | 2365 | 5 | 0,030 |
Saat memeriksa hasil sebelumnya, perhatikan bahwa jumlah baris yang dipindai, CPU yang digunakan, dan latensi semuanya berubah secara signifikan sekitar pukul 09.00. Untuk memahami alasan angka-angka ini meningkat secara drastis, periksa teks kueri dan lihat apakah ada perubahan dalam skema yang mungkin memengaruhi kueri.
Gunakan kueri berikut untuk mengambil teks kueri untuk kueri yang sedang Anda selidiki.
SELECT text,
text_truncated
FROM spanner_sys.query_stats_top_hour
WHERE text_fingerprint = 5505124206529314852
LIMIT 1;
Tindakan ini akan menampilkan hasil berikut.
| teks biasa | text_truncated |
|---|---|
| select * from orders where o_custkey = 36901; | false |
Saat memeriksa teks kueri yang ditampilkan, perhatikan bahwa kueri memfilter kolom bernama o_custkey. Ini adalah kolom non-kunci pada tabel orders. Ternyata, sebelumnya ada indeks pada kolom tersebut yang dihapus sekitar pukul 09.00. Hal ini menjelaskan perubahan biaya untuk kueri ini. Anda dapat menambahkan
kembali indeks atau, jika kueri jarang dijalankan, memutuskan untuk tidak memiliki
indeks dan menerima biaya baca yang lebih tinggi.
Sejauh ini, investigasi berfokus pada kueri yang berhasil diselesaikan dan mengidentifikasi satu alasan mengapa database mengalami penurunan performa. Pada langkah berikutnya, fokuslah pada kueri yang gagal atau dibatalkan dan periksa data tersebut untuk mendapatkan insight lebih lanjut.
Menyelidiki kueri yang gagal
Kueri yang tidak berhasil diselesaikan tetap menggunakan resource sebelum waktu tunggu habis, dibatalkan, atau gagal. Spanner melacak jumlah eksekusi dan resource yang digunakan oleh kueri yang gagal beserta kueri yang berhasil. Statistik ini tidak melacak pernyataan DML yang dipartisi yang gagal dan dibatalkan.
Untuk memeriksa apakah kueri yang gagal merupakan kontributor signifikan terhadap pemakaian sistem, periksa terlebih dahulu jumlah kueri yang gagal dalam interval waktu yang diinginkan.
SELECT interval_end,
all_failed_execution_count AS failed_count,
all_failed_avg_latency_seconds AS latency
FROM spanner_sys.query_stats_total_minute
WHERE
interval_end >= "2020-07-24T16:50:00Z"
AND interval_end <= "2020-07-24T17:00:00Z"
ORDER BY interval_end;
| interval_end | failed_count | latensi |
|---|---|---|
| 2020-07-24T16:52:00Z | 1 | 15.211391 |
| 2020-07-24T16:53:00Z | 3 | 58.312232 |
Selidiki lebih lanjut, cari kueri yang kemungkinan besar akan gagal menggunakan kueri berikut.
SELECT interval_end,
text_fingerprint,
execution_count,
avg_latency_seconds AS avg_latency,
all_failed_execution_count AS failed_count,
all_failed_avg_latency_seconds AS failed_latency,
cancelled_or_disconnected_execution_count AS cancel_count,
timed_out_execution_count AS to_count
FROM spanner_sys.query_stats_top_minute
WHERE all_failed_execution_count > 0
ORDER BY interval_end;
| interval_end | text_fingerprint | execution_count | failed_count | cancel_count | to_count |
|---|---|---|---|---|---|
| 2020-07-24T16:52:00Z | 5505124206529314852 | 3 | 1 | 1 | 0 |
| 2020-07-24T16:53:00Z | 1697951036096498470 | 2 | 1 | 1 | 0 |
| 2020-07-24T16:53:00Z | 5505124206529314852 | 5 | 2 | 1 | 1 |
Seperti yang ditunjukkan tabel sebelumnya, kueri dengan sidik jari 5505124206529314852
telah gagal beberapa kali selama interval waktu yang berbeda. Dengan pola kegagalan seperti ini, akan menarik untuk membandingkan latensi operasi yang berhasil dan yang gagal.
SELECT interval_end,
avg_latency_seconds AS combined_avg_latency,
all_failed_avg_latency_seconds AS failed_execution_latency,
( avg_latency_seconds * execution_count -
all_failed_avg_latency_seconds * all_failed_execution_count
) / (
execution_count - all_failed_execution_count ) AS success_execution_latency
FROM spanner_sys.query_stats_top_hour
WHERE text_fingerprint = 5505124206529314852;
| interval_end | combined_avg_latency | failed_execution_latency | success_execution_latency |
|---|---|---|---|
| 2020-07-24T17:00:00Z | 3.880420 | 13,830709 | 2,774832 |
Menerapkan praktik terbaik
Setelah mengidentifikasi kueri kandidat untuk pengoptimalan, selanjutnya lihat profil kueri dan coba optimalkan menggunakan praktik terbaik SQL.
Langkah berikutnya
Gunakan Kueri aktif terlama untuk menentukan kueri aktif yang berjalan paling lama.
Pelajari lebih lanjut cara Menyelidiki penggunaan CPU yang tinggi.
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.