Mendapatkan insight performa kueri
Dokumen ini menjelaskan cara menggunakan grafik eksekusi kueri untuk mendiagnosis masalah performa kueri, dan melihat insight performa kueri.
BigQuery menawarkan performa kueri yang kuat, tetapi juga merupakan sistem terdistribusi yang kompleks dengan banyak faktor internal dan eksternal yang dapat memengaruhi kecepatan kueri. Sifat deklaratif dari bahasa SQL juga dapat menyembunyikan kompleksitas eksekusi kueri. Ini berarti bahwa ketika kueri Anda berjalan lebih lambat dari yang diperkirakan, atau lebih lambat dari sebelumnya, memahami apa yang terjadi bisa menjadi tantangan.
Grafik eksekusi kueri menyediakan antarmuka intuitif untuk memeriksa detail performa kueri. Dengan menggunakannya, Anda dapat meninjau informasi paket kueri dalam format grafis untuk kueri apa pun, baik yang sedang berjalan maupun selesai.
Anda juga dapat menggunakan grafik eksekusi kueri untuk mendapatkan insight performa untuk kueri. Insight performa memberikan saran upaya terbaik untuk membantu Anda meningkatkan performa kueri. Karena performa kueri bersifat multi-aspek, insight performa mungkin hanya memberikan gambaran sebagian dari keseluruhan performa kueri.
Izin yang diperlukan
Untuk menggunakan grafik eksekusi kueri, Anda harus memiliki izin berikut:
bigquery.jobs.get
bigquery.jobs.listAll
Izin ini tersedia melalui peran Identity and Access Management (IAM) standar BigQuery berikut:
roles/bigquery.admin
roles/bigquery.resourceAdmin
roles/bigquery.resourceEditor
roles/bigquery.resourceViewer
Melihat insight performa kueri
Konsol
Ikuti langkah-langkah berikut untuk melihat insight performa kueri:
Buka halaman BigQuery di Konsol Google Cloud.
Di Editor, klik Histori Pribadi atau Histori Project.
Dalam daftar pekerjaan, identifikasi tugas kueri yang menarik minat Anda. Klik
Tindakan, dan pilih Buka kueri di editor.Pilih tab Execution Graph untuk melihat representasi grafis dari setiap tahap kueri:
Untuk menentukan apakah tahap kueri memiliki insight performa, lihat ikon yang ditampilkan. Tahapan yang memiliki ikon informasi
memiliki insight performa. Tahapan yang memiliki ikon centang tidak akan ditayangkan.Klik suatu tahap untuk membuka panel detail tahap, tempat Anda dapat melihat informasi berikut:
- Informasi paket kueri untuk panggung.
- Langkah-langkah yang dieksekusi di dalam tahapan.
- Semua insight performa yang berlaku.
Opsional: Jika Anda memeriksa kueri yang sedang berjalan, klik
Sync untuk memperbarui grafik eksekusi agar mencerminkan status kueri saat ini.Opsional: Untuk menandai tahapan teratas menurut durasi tahap di grafik, klik Sorot tahapan teratas menurut durasi.
Opsional: Untuk menandai tahapan teratas menurut waktu slot yang digunakan pada grafik, klik Sorot tahapan teratas berdasarkan pemrosesan.
Opsional: Untuk menyertakan tahap redistribusi acak pada grafik, klik Tampilkan tahap redistribusi acak.
Gunakan opsi ini untuk menampilkan tahap partisi ulang dan penggabungan yang disembunyikan dalam grafik eksekusi default.
Tahap partisi ulang dan penggabungan diperkenalkan saat kueri berjalan, dan digunakan untuk meningkatkan distribusi data di seluruh pekerja yang memproses kueri. Karena tahapan ini tidak terkait dengan teks kueri Anda, tahapan tersebut disembunyikan untuk menyederhanakan paket kueri yang ditampilkan.
Untuk kueri yang memiliki masalah regresi performa, insight performa juga ditampilkan di tab Informasi Tugas untuk kueri tersebut:
SQL
Di konsol Google Cloud, buka halaman BigQuery.
Di editor kueri, masukkan pernyataan berikut:
SELECT `bigquery-public-data`.persistent_udfs.job_url( project_id || ':us.' || job_id) AS job_url, query_info.performance_insights FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE DATE(creation_time) >= CURRENT_DATE - 30 -- scan 30 days of query history AND job_type = 'QUERY' AND state = 'DONE' AND error_result IS NULL AND statement_type != 'SCRIPT' AND EXISTS ( -- Only include queries which had performance insights SELECT 1 FROM UNNEST( query_info.performance_insights.stage_performance_standalone_insights ) WHERE slot_contention OR insufficient_shuffle_quota UNION ALL SELECT 1 FROM UNNEST( query_info.performance_insights.stage_performance_change_insights ) WHERE input_data_change.records_read_diff_percentage IS NOT NULL );
Klik
Run.
Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.
API
Anda bisa mendapatkan insight performa kueri dalam format non-grafis dengan
memanggil metode jobs.list
API dan memeriksa
informasi JobStatistics2
yang ditampilkan.
Menafsirkan insight performa kueri
Gunakan bagian ini untuk mempelajari lebih lanjut arti insight performa dan cara mengatasinya.
Insight performa ditujukan untuk dua audiens:
Analis: Anda menjalankan kueri dalam sebuah proyek. Anda ingin mengetahui alasan kueri yang telah Anda jalankan sebelumnya tiba-tiba berjalan lebih lambat, dan untuk mendapatkan tips tentang cara meningkatkan performa kueri. Anda memiliki izin yang dijelaskan dalam Izin yang diperlukan.
Administrator data lake atau data warehouse: Anda dapat mengelola resource dan reservasi BigQuery organisasi Anda. Anda memiliki izin yang terkait dengan peran Admin BigQuery.
Setiap bagian berikut memberikan panduan tentang apa yang dapat Anda lakukan untuk mengatasi insight performa yang Anda terima, berdasarkan peran yang Anda tempati.
Pertentangan slot
Saat Anda menjalankan kueri, BigQuery mencoba membagi pekerjaan yang diperlukan oleh kueri Anda menjadi beberapa tugas. Tugas adalah potongan data tunggal yang dimasukkan ke dan dikeluarkan dari suatu tahapan. Satu slot mengambil tugas dan mengeksekusi potongan data tersebut untuk tahapan tersebut. Idealnya, slot BigQuery menjalankan tugas ini secara paralel untuk mencapai performa tinggi. Pertentangan slot terjadi saat kueri Anda memiliki banyak tugas yang siap untuk mulai dijalankan, tetapi BigQuery tidak bisa mendapatkan cukup slot yang tersedia untuk menjalankannya.
Apa yang harus dilakukan jika Anda seorang analis
Kurangi data yang diproses dalam kueri dengan mengikuti panduan dalam Mengurangi data yang diproses dalam kueri.
Yang harus dilakukan jika Anda adalah administrator
Tingkatkan ketersediaan slot atau kurangi penggunaan slot dengan melakukan tindakan berikut:
- Jika Anda menggunakan harga sesuai permintaan BigQuery, kueri Anda menggunakan kumpulan slot bersama. Pertimbangkan untuk beralih ke harga analisis berbasis kapasitas dengan membeli reservasi. Reservasi memungkinkan Anda memesan slot khusus untuk kueri organisasi Anda.
Jika Anda menggunakan reservasi BigQuery, pastikan ada cukup slot di reservasi yang ditetapkan ke project yang menjalankan kueri. Reservasi mungkin tidak memiliki cukup slot dalam skenario berikut:
- Ada tugas lain yang menggunakan slot reservasi. Anda dapat menggunakan Diagram Resource Admin untuk melihat cara organisasi Anda menggunakan reservasi.
- Reservasi tidak memiliki cukup slot yang ditetapkan untuk menjalankan kueri dengan cukup cepat. Anda dapat menggunakan estimator slot untuk mendapatkan perkiraan seberapa besar reservasi Anda untuk memproses tugas kueri secara efisien.
Untuk mengatasinya, Anda dapat mencoba salah satu solusi berikut:
- Tambahkan lebih banyak slot ke reservasi tersebut.
- Buat reservasi tambahan dan tetapkan ke project yang menjalankan kueri.
- Menyebarkan kueri yang menghabiskan banyak resource, baik dari waktu ke waktu dalam reservasi maupun melalui berbagai reservasi.
Pastikan tabel yang Anda buat kuerinya dikelompokkan. Pengelompokan membantu memastikan bahwa BigQuery dapat dengan cepat membaca kolom dengan data yang berkorelasi.
Pastikan tabel yang Anda buat kuerinya telah partitioned. Untuk tabel yang tidak dipartisi, BigQuery akan membaca seluruh tabel. Mempartisi tabel membantu memastikan bahwa Anda hanya membuat kueri untuk subset tabel yang Anda minati.
Kuota acak tidak memadai
Sebelum menjalankan kueri, BigQuery membagi logika kueri Anda menjadi beberapa tahap. Slot BigQuery menjalankan tugas untuk setiap tahap. Saat slot menyelesaikan eksekusi tugas tahap, slot akan menyimpan hasil perantara dalam shuffle. Tahapan selanjutnya dalam kueri Anda akan membaca data dari acak untuk melanjutkan eksekusi kueri. Kuota acak yang tidak memadai terjadi jika Anda memiliki lebih banyak data yang perlu ditulis untuk diacak daripada kapasitasnya.
Apa yang harus dilakukan jika Anda seorang analis
Demikian pula dengan pertentangan slot, mengurangi jumlah data yang diproses kueri dapat mengurangi penggunaan acak. Untuk melakukannya, ikuti panduan dalam Mengurangi data yang diproses dalam kueri.
Operasi tertentu dalam SQL cenderung menggunakan shuffle secara lebih ekstensif, terutama operasi JOIN
dan klausa GROUP BY
.
Jika memungkinkan, mengurangi jumlah data dalam operasi ini dapat mengurangi penggunaan acak.
Yang harus dilakukan jika Anda adalah administrator
Kurangi pertentangan kuota acak dengan melakukan tindakan berikut:
- Sama dengan pertentangan slot, jika Anda menggunakan harga on-demand BigQuery, kueri Anda akan menggunakan kumpulan slot bersama. Pertimbangkan untuk beralih ke harga analisis berbasis kapasitas dengan membeli reservasi. Reservasi memberi Anda slot khusus dan kapasitas acak untuk kueri project Anda.
Jika Anda menggunakan reservasi BigQuery, slot dilengkapi dengan kapasitas acak khusus. Jika reservasi Anda menjalankan beberapa kueri yang banyak menggunakan acak, hal ini dapat menyebabkan kueri lain yang berjalan secara paralel tidak mendapatkan kapasitas acak yang cukup. Anda dapat mengidentifikasi tugas mana yang menggunakan kapasitas acak secara ekstensif dengan membuat kueri kolom
period_shuffle_ram_usage_ratio
di tampilanINFORMATION_SCHEMA.JOBS_TIMELINE
.Untuk mengatasinya, Anda dapat mencoba satu atau beberapa solusi berikut:
- Tambahkan lebih banyak slot ke reservasi tersebut.
- Buat reservasi tambahan dan tetapkan ke project yang menjalankan kueri.
- Menyebarkan kueri secara acak, baik seiring waktu dalam reservasi atau melalui reservasi yang berbeda.
Perubahan skala input data
Mendapatkan insight performa ini menunjukkan bahwa kueri Anda membaca data setidaknya 50% lebih banyak untuk tabel input tertentu daripada terakhir kali Anda menjalankan kueri. Anda dapat menggunakan histori perubahan tabel untuk melihat apakah ukuran tabel yang digunakan dalam kueri telah meningkat baru-baru ini.
Apa yang harus dilakukan jika Anda seorang analis
Kurangi data yang diproses dalam kueri dengan mengikuti panduan dalam Mengurangi data yang diproses dalam kueri.
Gabungan berkardinalitas tinggi
Jika sebuah kueri berisi join dengan kunci non-unik di kedua sisi join, ukuran tabel output dapat jauh lebih besar daripada ukuran salah satu tabel input. Insight ini menunjukkan bahwa rasio baris output terhadap baris input tinggi dan menawarkan informasi tentang jumlah baris ini.
Apa yang harus dilakukan jika Anda seorang analis
Periksa kondisi join untuk mengonfirmasi bahwa peningkatan ukuran tabel output telah diperkirakan. Hindari penggunaan
cross join.
Jika Anda harus menggunakan cross join, coba gunakan klausa GROUP BY
untuk mengagregasi hasil sebelumnya, atau gunakan fungsi jendela. Untuk mengetahui informasi selengkapnya, lihat
Mengurangi data sebelum menggunakan JOIN
.
Kemiringan partisi
Untuk memberikan masukan atau meminta dukungan terkait fitur ini, kirim email ke
bq-query-inspector-feedback@google.com
.
Distribusi data yang condong dapat menyebabkan kueri berjalan lambat. Saat kueri dijalankan, BigQuery membagi data menjadi partisi kecil. Anda tidak dapat berbagi partisi antar slot. Oleh karena itu, jika data tidak didistribusikan secara merata, beberapa partisi menjadi sangat besar, yang menyebabkan error pada slot yang memproses partisi yang berukuran terlalu besar.
Kemiringan terjadi dalam tahap JOIN
. Saat Anda menjalankan operasi JOIN
, BigQuery membagi data di sisi kanan dan kiri operasi JOIN
menjadi beberapa partisi. Jika partisi terlalu besar, data
akan diseimbangkan kembali dengan tahap partisi ulang. Jika kemiringannya terlalu buruk dan BigQuery tidak dapat menyeimbangkannya kembali, insight yang condong ke partisi akan ditambahkan ke tahap 'JOIN'. Proses ini dikenal sebagai tahap partisi ulang. Jika BigQuery mendeteksi partisi besar yang tidak dapat dibagi lagi, insight condong partisi akan ditambahkan ke tahap JOIN
.
Apa yang harus dilakukan jika Anda seorang analis
Untuk menghindari kecondongan partisi, filter data Anda sedini mungkin. Untuk mengetahui informasi selengkapnya tentang cara menghindari partisi condong, lihat Memfilter data untuk data yang condong.
Menafsirkan informasi tahap kueri
Selain menggunakan insight performa kueri, Anda juga dapat menggunakan panduan berikut saat meninjau detail tahap kueri untuk membantu menentukan apakah ada masalah dengan kueri:
- Jika nilai Tunggu ms untuk satu atau beberapa tahap lebih tinggi dibandingkan dengan kueri yang dijalankan sebelumnya:
- Lihat apakah Anda memiliki cukup slot yang tersedia untuk mengakomodasi beban kerja Anda. Jika tidak, lakukan load balancing saat Anda menjalankan kueri yang menggunakan banyak resource agar tidak saling bersaing.
- Jika nilai Tunggu ms lebih tinggi dari yang sebelumnya hanya satu tahap, lihat tahap sebelumnya untuk mengetahui apakah bottleneck telah muncul di sana. Hal-hal seperti perubahan substansial pada data atau skema tabel yang terlibat dalam kueri dapat memengaruhi performa kueri.
- Jika nilai Mengacak byte output untuk suatu tahap lebih tinggi dibandingkan dengan kueri yang dijalankan sebelumnya, atau dibandingkan dengan tahap sebelumnya, evaluasi langkah-langkah yang diproses dalam tahap tersebut untuk melihat apakah ada yang membuat data dalam jumlah besar yang tidak terduga. Salah satu penyebab umum untuk hal ini adalah saat sebuah langkah memproses
INNER JOIN
yang memiliki kunci duplikat di kedua sisi gabungan. Tindakan ini dapat mengembalikan data dalam jumlah besar yang tidak terduga. - Gunakan grafik eksekusi untuk melihat tahapan teratas menurut durasi dan pemrosesan. Pertimbangkan jumlah data yang dihasilkan dan apakah setara dengan ukuran tabel yang dirujuk dalam kueri. Jika tidak, tinjau langkah-langkah dalam tahap tersebut untuk melihat apakah salah satunya dapat menghasilkan jumlah data sementara yang tidak terduga.
Langkah selanjutnya
- Tinjau panduan pengoptimalan kueri untuk mendapatkan tips tentang cara meningkatkan performa kueri.