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:

  1. Buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di Editor, klik Personal History atau Project History.

  3. Dalam daftar tugas, identifikasi tugas kueri yang Anda minati. Klik Tindakan, lalu pilih Buka kueri di editor.

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

    Paket kueri grafis dalam grafik eksekusi.

    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.

  5. Klik 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 Sinkronkan untuk memperbarui grafik eksekusi sehingga mencerminkan status kueri saat ini.

    Sinkronkan grafik ke kueri yang sedang berjalan.

  7. Opsional: Untuk menandai tahap teratas menurut durasi tahap pada grafik, klik Menandai tahap teratas menurut durasi.

    Menampilkan tahap teratas berdasarkan durasi.

  8. Opsional: Untuk menandai tahap teratas berdasarkan waktu slot yang digunakan pada grafik, klik Menandai tahap teratas berdasarkan pemrosesan.

    Menampilkan tahap teratas berdasarkan pemrosesan.

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

    Menampilkan tahap teratas berdasarkan pemrosesan.

    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:

Tab informasi lowongan.

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

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