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 bahasa SQL juga dapat menyembunyikan kompleksitas eksekusi kueri. Artinya, saat kueri Anda berjalan lebih lambat dari yang diperkirakan, atau lebih lambat dari operasi 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 rencana 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 terbaik untuk membantu Anda meningkatkan performa kueri. Karena performa kueri bersifat multifaset, insight performa mungkin hanya memberikan gambaran sebagian dari performa kueri secara keseluruhan.
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) bawaan 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 Personal History atau Project History.
Dalam daftar tugas, identifikasi tugas kueri yang Anda minati. Klik
Tindakan, lalu pilih Buka kueri di editor.Pilih tab Execution Graph untuk melihat representasi grafis setiap tahap kueri:
Untuk menentukan apakah tahap kueri memiliki insight performa, lihat ikon yang ditampilkan. Tahap yang memiliki ikon informasi
memiliki insight performa. Tahap yang memiliki ikon centang tidak akan ditampilkan.Klik tahap untuk membuka panel detail tahap, tempat Anda dapat melihat informasi berikut:
- Informasi rencana kueri untuk tahap.
- Langkah-langkah yang dieksekusi di stage.
- Insight performa apa pun yang berlaku.
Opsional: Jika Anda memeriksa kueri yang sedang berjalan, klik
Sinkronkan untuk memperbarui grafik eksekusi sehingga mencerminkan status kueri saat ini.Opsional: Untuk menandai tahap teratas menurut durasi tahap pada grafik, klik Menandai tahap teratas menurut durasi.
Opsional: Untuk menandai tahap teratas berdasarkan waktu slot yang digunakan pada grafik, klik Menandai tahap teratas berdasarkan pemrosesan.
Opsional: Untuk menyertakan tahap redistribusi pengacakan pada grafik, klik Tampilkan tahap redistribusi pengacakan.
Gunakan opsi ini untuk menampilkan tahap pemisahan ulang dan penggabungan yang disembunyikan dalam grafik eksekusi default.
Tahapan pemisahan ulang dan penggabungan diperkenalkan saat kueri berjalan, dan digunakan untuk meningkatkan distribusi data di seluruh pekerja yang memproses kueri. Karena tidak terkait dengan teks kueri Anda, tahap ini 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-REGION_NAME`.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 API jobs.list
dan memeriksa
informasi JobStatistics2
yang ditampilkan.
Menafsirkan insight performa kueri
Gunakan bagian ini untuk mempelajari lebih lanjut arti insight performa dan cara menanganinya.
Insight performa ditujukan untuk dua audiens:
Analis: Anda menjalankan kueri dalam project. Anda ingin mengetahui mengapa kueri yang telah dijalankan sebelumnya tiba-tiba berjalan lebih lambat, dan mendapatkan tips tentang cara meningkatkan performa kueri. Anda memiliki izin yang dijelaskan dalam Izin yang diperlukan.
Administrator data lake atau data warehouse: Anda mengelola resource dan reservasi BigQuery organisasi. Anda memiliki izin yang terkait dengan peran BigQuery Admin.
Setiap bagian berikut memberikan panduan tentang tindakan yang dapat Anda lakukan untuk mengatasi insight performa yang Anda terima, berdasarkan peran yang Anda miliki.
Pertentangan slot
Saat Anda menjalankan kueri, BigQuery akan mencoba membagi pekerjaan yang diperlukan oleh kueri menjadi tugas. Tugas adalah satu bagian data yang dimasukkan ke dalam dan output dari tahap. Satu slot mengambil tugas dan menjalankan bagian data tersebut untuk tahap. Idealnya, slot BigQuery menjalankan tugas ini secara paralel untuk mencapai performa tinggi. Persaingan slot terjadi saat kueri Anda memiliki banyak tugas yang siap untuk mulai dieksekusi, tetapi BigQuery tidak dapat mendapatkan slot yang tersedia cukup untuk menjalankannya.
Yang harus dilakukan jika Anda adalah analis
Kurangi data yang Anda proses dalam kueri dengan mengikuti panduan di Mengurangi data yang diproses dalam kueri.
Tindakan 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 akan menggunakan kumpulan slot bersama. Sebaiknya beralih ke harga analisis berbasis kapasitas dengan membeli reservasi. Dengan reservasi, Anda dapat memesan slot khusus untuk kueri organisasi.
Jika Anda menggunakan pemesanan BigQuery, pastikan ada cukup slot dalam pemesanan 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 slot yang ditetapkan cukup untuk menjalankan kueri dengan cukup cepat. Anda dapat menggunakan estimator slot untuk mendapatkan perkiraan besaran reservasi yang diperlukan untuk memproses tugas kueri secara efisien.
Untuk mengatasinya, Anda dapat mencoba salah satu solusi berikut:
- Tambahkan lebih banyak slot (slot dasar pengukuran atau slot reservasi maksimum) ke pemesanan tersebut.
- Buat pemesanan tambahan dan tetapkan ke project yang menjalankan kueri.
- Sebarkan kueri yang membutuhkan banyak resource, baik dari waktu ke waktu dalam reservasi atau di berbagai reservasi.
Pastikan tabel yang Anda buat kuerinya telah dikelompokkan. Pengelompokan membantu memastikan BigQuery dapat membaca kolom dengan data yang berkorelasi dengan cepat.
Pastikan tabel yang Anda buat kuerinya telah dipartisi. Untuk tabel yang tidak dipartisi, BigQuery akan membaca seluruh tabel. Mempartisi tabel membantu memastikan bahwa Anda hanya membuat kueri pada subset tabel yang Anda minati.
Kuota acak tidak memadai
Sebelum menjalankan kueri, BigQuery akan membagi logika kueri menjadi tahap. Slot BigQuery akan menjalankan tugas untuk setiap tahap. Saat menyelesaikan eksekusi tugas tahap, slot akan menyimpan hasil perantara di shuffle. Tahap berikutnya dalam kueri Anda membaca data dari shuffle untuk melanjutkan eksekusi kueri. Kuota pengacakan yang tidak mencukupi terjadi jika Anda memiliki lebih banyak data yang perlu ditulis untuk pengacakan daripada kapasitas pengacakan.
Yang harus dilakukan jika Anda adalah analis
Serupa dengan pertentangan slot, mengurangi jumlah data yang diproses kueri Anda dapat mengurangi penggunaan shuffle. Untuk melakukannya, ikuti panduan di Mengurangi data yang diproses dalam kueri.
Operasi tertentu di SQL cenderung membuat penggunaan shuffle yang lebih luas,
terutama
operasi JOIN
dan klausa GROUP BY
.
Jika memungkinkan, mengurangi jumlah data dalam operasi ini dapat mengurangi penggunaan pengacakan.
Tindakan yang harus dilakukan jika Anda adalah administrator
Kurangi pertentangan kuota pengacakan dengan melakukan tindakan berikut:
- Serupa dengan pertentangan slot, jika Anda menggunakan harga sesuai permintaan BigQuery, kueri Anda akan menggunakan kumpulan slot bersama. Sebaiknya beralih ke harga analisis berbasis kapasitas dengan membeli reservasi. Reservasi memberi Anda slot khusus dan kapasitas shuffle untuk kueri project Anda.
Jika Anda menggunakan reservasi BigQuery, slot akan dilengkapi dengan kapasitas shuffle khusus. Jika reservasi Anda menjalankan beberapa kueri yang menggunakan shuffle secara ekstensif, hal ini dapat menyebabkan kueri lain yang berjalan secara paralel tidak mendapatkan kapasitas shuffle yang memadai. Anda dapat mengidentifikasi tugas mana yang menggunakan kapasitas pengacakan secara ekstensif dengan membuat kueri untuk 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 pemesanan tambahan dan tetapkan ke project yang menjalankan kueri.
- Sebarkan kueri yang intensif dalam pengacakan, baik dari waktu ke waktu dalam pemesanan atau di berbagai pemesanan.
Perubahan skala input data
Insight performa ini menunjukkan bahwa kueri Anda membaca setidaknya 50% lebih banyak data untuk tabel input tertentu dibandingkan saat terakhir kali Anda menjalankan kueri. Anda dapat menggunakan histori perubahan tabel untuk melihat apakah ukuran tabel yang digunakan dalam kueri baru-baru ini meningkat.
Yang harus dilakukan jika Anda adalah analis
Kurangi data yang Anda proses dalam kueri dengan mengikuti panduan di Mengurangi data yang diproses dalam kueri.
Join berkardinalitas tinggi
Jika 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.
Yang harus dilakukan jika Anda adalah analis
Periksa kondisi join Anda untuk mengonfirmasi bahwa peningkatan ukuran
tabel output sudah diperkirakan. Hindari penggunaan
cross join.
Jika Anda harus menggunakan join silang, coba gunakan klausa GROUP BY
untuk melakukan pra-agregasi
hasil, atau gunakan fungsi jendela. Untuk mengetahui informasi selengkapnya, lihat
Mengurangi data sebelum menggunakan JOIN
.
Skew partisi
Untuk memberikan masukan atau meminta dukungan terkait fitur ini, kirim email ke
bq-query-inspector-feedback@google.com
.
Distribusi data yang miring dapat menyebabkan kueri berjalan lambat. Saat kueri dieksekusi, BigQuery akan membagi data menjadi partisi kecil. Anda tidak dapat berbagi partisi antar-slot. Oleh karena itu, jika data didistribusikan secara tidak merata, beberapa partisi menjadi sangat besar, yang menyebabkan error pada slot yang memproses partisi yang terlalu besar.
Skew terjadi dalam JOIN
tahap. Saat Anda menjalankan operasi JOIN
,
BigQuery akan membagi data di sisi kanan dan kiri
operasi JOIN
menjadi partisi. Jika partisi terlalu besar, data akan
diimbangi kembali oleh tahap pemisahan ulang. Jika penyimpangan terlalu buruk dan
BigQuery tidak dapat menyeimbangkan lebih lanjut, insight penyimpangan partisi
akan ditambahkan ke tahap 'JOIN'. Proses ini dikenal sebagai tahap pemisahan ulang. Jika
BigQuery mendeteksi partisi besar yang tidak dapat dibagi
lebih lanjut, insight kemiringan partisi akan ditambahkan ke tahap JOIN
.
Yang harus dilakukan jika Anda adalah analis
Untuk menghindari kecondongan partisi, filter data Anda sedini mungkin.
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 Wait ms untuk satu atau beberapa tahap tinggi dibandingkan dengan
eksekusi kueri sebelumnya:
- Lihat apakah Anda memiliki cukup slot yang tersedia untuk mengakomodasi beban kerja Anda. Jika tidak, lakukan load balancing saat Anda menjalankan kueri yang membutuhkan banyak resource agar tidak bersaing satu sama lain.
- Jika nilai Wait ms lebih tinggi dari nilai yang ada untuk satu tahap saja, lihat tahap sebelumnya untuk melihat apakah bottleneck telah diperkenalkan di sana. Hal-hal seperti perubahan yang signifikan pada data atau skema tabel yang terlibat dalam kueri dapat memengaruhi performa kueri.
- Jika nilai Shuffle output bytes untuk suatu tahap tinggi dibandingkan dengan
proses kueri sebelumnya, atau dibandingkan dengan tahap sebelumnya, evaluasi
langkah-langkah yang diproses di tahap tersebut untuk melihat apakah ada yang menghasilkan data dalam jumlah besar
yang tidak terduga. Salah satu penyebab umum hal ini adalah saat langkah memproses
INNER JOIN
dengan kunci duplikat di kedua sisi join. Tindakan ini dapat menampilkan jumlah data yang tidak terduga. - Gunakan grafik eksekusi untuk melihat tahap teratas berdasarkan durasi dan pemrosesan. Pertimbangkan jumlah data yang dihasilkan dan apakah data tersebut sebanding dengan ukuran tabel yang dirujuk dalam kueri. Jika tidak, tinjau langkah-langkah dalam tahap tersebut untuk melihat apakah ada langkah yang dapat menghasilkan jumlah data sementara yang tidak terduga.
Langkah selanjutnya
- Tinjau panduan pengoptimalan kueri untuk mendapatkan tips tentang cara meningkatkan performa kueri.