Pengantar tentang mengoptimalkan performa kueri

Terkadang, kueri berjalan lebih lambat daripada yang Anda inginkan. Secara umum, kueri yang melakukan lebih sedikit pekerjaan akan berperforma lebih baik. Kueri tersebut berjalan lebih cepat dan memakai lebih sedikit resource, sehingga dapat mengurangi biaya dan mengurangi kegagalan. Dokumen ini berisi ringkasan tentang teknik pengoptimalan yang dapat meningkatkan performa kueri di BigQuery.

Performa kueri

Mengevaluasi performa kueri di BigQuery akan melibatkan beberapa faktor:

Untuk mengevaluasi apakah kueri tertentu bermasalah atau apakah Anda mengalami pertentangan resource, Anda dapat menggunakan Cloud Monitoring atau chart resource administratif BigQuery untuk memantau bagaimana tugas BigQuery memakai resource dari waktu ke waktu. Jika mengidentifikasi kueri yang lambat atau intensif resource, Anda dapat memfokuskan pengoptimalan performa pada kueri tersebut.

Beberapa pola kueri, terutama yang dihasilkan oleh fitur business intelligence, dapat dipercepat dengan menggunakan BigQuery BI Engine. BI Engine adalah layanan analisis dalam memori yang cepat dan mempercepat banyak kueri SQL di BigQuery dengan meng-cache data yang paling sering Anda gunakan secara cerdas. BI Engine dibangun ke dalam BigQuery, yang berarti Anda sering kali bisa mendapatkan performa yang lebih baik tanpa modifikasi kueri apa pun.

Seperti halnya sistem lainnya, pengoptimalan performa terkadang menimbulkan kerugian. Misalnya, penggunaan sintaksis SQL lanjutan terkadang dapat menimbulkan kompleksitas dan mengurangi kemampuan pemahaman tentang kueri bagi orang yang bukan pakar SQL. Menghabiskan waktu untuk pengoptimalan mikro untuk workload yang tidak penting juga dapat mengalihkan resource dari membuat fitur baru untuk aplikasi Anda atau melakukan pengoptimalan yang lebih berdampak. Oleh karena itu, untuk membantu Anda mencapai laba atas investasi yang setinggi mungkin, sebaiknya fokuskan pengoptimalan pada workload yang paling penting bagi pipeline analisis data Anda.

Kapasitas dan konkurensi

BigQuery menawarkan dua model harga untuk kueri: harga on-demand dan harga berbasis kapasitas. Model on-demand menyediakan kumpulan kapasitas bersama dan harga didasarkan pada jumlah data yang diproses oleh setiap kueri yang Anda jalankan.

Model berbasis kapasitas direkomendasikan jika Anda ingin menganggarkan pengeluaran bulanan yang konsisten atau jika Anda membutuhkan kapasitas lebih daripada yang tersedia dengan model on-demand. Saat menggunakan harga berdasarkan kapasitas, Anda mengalokasikan kapasitas pemrosesan kueri khusus yang diukur dalam slot. Biaya semua byte yang diproses termasuk dalam harga berbasis kapasitas. Selain komitmen slot tetap, Anda dapat menggunakan slot penskalaan otomatis, yang menyediakan kapasitas dinamis berdasarkan workload kueri Anda.

Selama pemrosesan kueri SQL, BigQuery menguraikan kapasitas komputasi yang diperlukan untuk mengeksekusi setiap tahap kueri ke dalam sejumlah slot. BigQuery secara otomatis menentukan jumlah kueri yang dapat berjalan serentak sebagai berikut:

  • Model on-demand: jumlah slot yang tersedia dalam project
  • Model berbasis kapasitas: jumlah slot yang tersedia dalam pemesanan

Kueri yang memerlukan lebih banyak slot daripada yang tersedia akan dimasukkan ke antrean sampai resource pemrosesan tersedia. Setelah kueri memulai eksekusi, BigQuery akan menghitung berapa banyak slot yang digunakan setiap tahap kueri berdasarkan ukuran dan kompleksitas tahap, serta jumlah slot yang tersedia. BigQuery menggunakan teknik yang disebut penjadwalan adil untuk memastikan bahwa setiap kueri memiliki kapasitas yang cukup untuk melanjutkan.

Akses ke lebih banyak slot tidak selalu menghasilkan performa yang lebih cepat untuk kueri. Namun, kumpulan slot yang lebih besar dapat meningkatkan performa kueri yang besar atau kompleks, dan performa workload yang sangat serentak. Untuk meningkatkan performa kueri, Anda dapat mengubah pemesanan slot atau menetapkan batas yang lebih tinggi untuk penskalaan otomatis slot.

Linimasa dan paket kueri

BigQuery akan menghasilkan paket kueri setiap kali Anda menjalankan kueri. Memahami paket ini sangat penting untuk pengoptimalan kueri yang efektif. Paket kueri mencakup statistik eksekusi seperti byte yang dibaca dan waktu slot yang digunakan. Paket kueri juga mencakup detail tentang berbagai tahap eksekusi, yang dapat membantu Anda mendiagnosis dan meningkatkan performa kueri. Grafik eksekusi kueri menyediakan antarmuka grafis untuk melihat paket kueri dan mendiagnosis masalah performa kueri.

Anda juga dapat menggunakan metode API jobs.get atau tampilan INFORMATION_SCHEMA.JOBS untuk mengambil informasi linimasa dan paket kueri. Informasi ini digunakan oleh BigQuery Visualiser, alat open source yang secara visual menggambarkan alur tahap eksekusi dalam tugas BigQuery.

Saat menjalankan tugas kueri, BigQuery akan mengonversi pernyataan SQL deklaratif menjadi grafik eksekusi. Grafik ini dibagi menjadi serangkaian tahap kueri, yang terdiri dari kumpulan langkah-langkah eksekusi yang lebih terperinci. BigQuery menggunakan arsitektur paralel yang sangat terdistribusi untuk menjalankan kueri-kueri ini. Tahapan BigQuery membuat model unit kerja yang mungkin dijalankan oleh banyak calon pekerja secara paralel. Tahapan berkomunikasi satu sama lain melalui arsitektur acak yang cepat dan terdistribusi.

Paket eksekusi kueri.

Selain paket kueri, tugas kueri juga menampilkan linimasa eksekusi. Linimasa ini menyediakan penghitungan unit pekerjaan yang telah selesai, tertunda, dan aktif dalam pekerja kueri. Kueri mungkin memiliki beberapa tahapan dengan pekerja aktif secara bersamaan, sehingga linimasa dimaksudkan untuk menampilkan progres kueri secara keseluruhan.

Statistik linimasa.

Untuk memperkirakan seberapa mahal kueri secara komputasi, Anda dapat melihat total jumlah detik slot yang digunakan kueri. Makin rendah jumlah detik slot, makin baik, karena artinya lebih banyak resource tersedia untuk kueri lain yang berjalan dalam project yang sama pada waktu yang sama.

Statistik linimasa dan paket kueri dapat membantu Anda memahami cara BigQuery menjalankan kueri, dan apakah tahap tertentu mendominasi penggunaan resource. Misalnya, tahap JOIN yang menghasilkan baris output yang jauh lebih banyak daripada baris input mungkin mengindikasikan peluang untuk memfilter lebih awal dalam kueri. Namun, sifat layanan yang terkelola membatasi apakah beberapa detail dapat ditindaklanjuti secara langsung. Untuk mengetahui praktik dan teknik terbaik guna meningkatkan performa dan eksekusi kueri, baca Mengoptimalkan komputasi kueri.

Langkah selanjutnya