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:

  1. Buka halaman BigQuery di Konsol Google Cloud.

    Buka halaman BigQuery

  2. Di Editor, klik Histori Pribadi atau Histori Project.

  3. Dalam daftar pekerjaan, identifikasi tugas kueri yang menarik minat Anda. Klik Tindakan, dan pilih Buka kueri di editor.

  4. Pilih tab Execution Graph untuk melihat representasi grafis dari setiap tahap kueri:

    Rencana kueri grafis dalam grafik eksekusi.

    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.

  5. Klik suatu tahap untuk membuka panel detail tahap, tempat Anda dapat melihat informasi berikut:

    Detail tahap kueri.

  6. Opsional: Jika Anda memeriksa kueri yang sedang berjalan, klik Sync untuk memperbarui grafik eksekusi agar mencerminkan status kueri saat ini.

    Menyinkronkan grafik ke kueri yang sedang berjalan.

  7. Opsional: Untuk menandai tahapan teratas menurut durasi tahap di grafik, klik Sorot tahapan teratas menurut durasi.

    Tampilkan panggung teratas menurut durasi.

  8. Opsional: Untuk menandai tahapan teratas menurut waktu slot yang digunakan pada grafik, klik Sorot tahapan teratas berdasarkan pemrosesan.

    Tampilkan tahapan teratas dengan memproses.

  9. Opsional: Untuk menyertakan tahap redistribusi acak pada grafik, klik Tampilkan tahap redistribusi acak.

    Tampilkan tahapan teratas dengan memproses.

    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:

Tab informasi pekerjaan.

SQL

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. 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
      );
    

  3. 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 tampilan INFORMATION_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