Memperkirakan dan mengontrol biaya

Halaman ini menjelaskan cara memperkirakan biaya dan mencantumkan praktik terbaik untuk mengontrol biaya di BigQuery. BigQuery menawarkan dua jenis model harga, yaitu harga sesuai permintaan dan berbasis kapasitas. Untuk mengetahui informasi tentang harga, lihat Harga BigQuery.

Dengan BigQuery, Anda dapat memperkirakan biaya menjalankan kueri, menghitung byte yang diproses oleh berbagai kueri, dan mendapatkan estimasi biaya bulanan berdasarkan proyeksi penggunaan. Untuk mengontrol biaya, Anda juga harus mengikuti praktik terbaik guna mengoptimalkan komputasi kueri dan penyimpanan BigQuery. Untuk praktik terbaik khusus biaya, lihat Mengontrol biaya kueri.

Untuk memantau biaya kueri dan penggunaan BigQuery, analisis log audit BigQuery.

Memperkirakan biaya kueri

BigQuery menyediakan berbagai metode untuk memperkirakan biaya:

Penghitungan ukuran kueri sesuai permintaan

Untuk menghitung jumlah byte yang diproses oleh berbagai jenis kueri menggunakan model penagihan sesuai permintaan, lihat bagian berikut:

Membuat kueri format berdasarkan kolom di Cloud Storage

Jika data eksternal Anda disimpan di ORC atau Parquet, jumlah byte yang dikenai biaya terbatas pada kolom yang dibaca BigQuery. Karena jenis data dari sumber data eksternal dikonversi ke jenis data BigQuery berdasarkan kueri, jumlah byte yang dibaca dihitung berdasarkan ukuran jenis data BigQuery. Untuk informasi tentang konversi jenis data, lihat halaman berikut:

Menggunakan Kalkulator Harga Google Cloud

Kalkulator Harga Google Cloud dapat membantu Anda membuat estimasi biaya bulanan secara keseluruhan untuk BigQuery berdasarkan proyeksi penggunaan.

Sesuai permintaan

Untuk memperkirakan biaya di Kalkulator Harga Google Cloud saat menggunakan model harga sesuai permintaan, ikuti langkah-langkah berikut:

  1. Buka Kalkulator Harga Google Cloud.
  2. Klik BigQuery.
  3. Klik tab Sesuai Permintaan.
  4. Untuk Harga Penyimpanan, masukkan estimasi ukuran tabel di kolom penyimpanan. Anda hanya perlu memperkirakan penyimpanan fisik atau penyimpanan logis, bergantung pada model penagihan penyimpanan set data.
  5. Untuk Harga Kueri, masukkan estimasi byte yang dibaca dari uji coba atau validator kueri.
  6. Klik Tambahkan ke Estimasi.
  7. Estimasi akan muncul di sebelah kanan. Perhatikan bahwa Anda dapat menyimpan atau mengirim estimasi melalui email.

Untuk informasi selengkapnya, lihat harga sesuai permintaan.

Edisi

Untuk memperkirakan biaya di Kalkulator Harga Google Cloud saat menggunakan model harga berbasis kapasitas dengan edisi BigQuery, ikuti langkah-langkah berikut:

  1. Buka Kalkulator Harga Google Cloud.
  2. Klik BigQuery.
  3. Klik tab Edisi.
  4. Pilih lokasi tempat slot digunakan.
  5. Pilih Edisi Anda.
  6. Pilih Slot maksimum, Slot dasar pengukuran, Komitmen opsional, dan Estimasi penggunaan penskalaan otomatis.
  7. Pilih lokasi tempat data disimpan.
  8. Masukkan estimasi penggunaan penyimpanan untuk Active storage, Long-term storage, Streaming insert, dan Streaming read. Anda hanya perlu memperkirakan penyimpanan fisik atau penyimpanan logis, bergantung pada model penagihan penyimpanan set data.
  9. Klik Tambahkan ke Estimasi.

Untuk informasi selengkapnya, lihat harga berdasarkan kapasitas.

Mengontrol biaya kueri

Untuk mengoptimalkan biaya kueri, pastikan Anda memiliki penyimpanan yang dioptimalkan dan komputasi kueri. Untuk metode tambahan guna mengontrol biaya kueri, lihat bagian berikut:

Memeriksa biaya kueri sebelum menjalankannya

Praktik terbaik: Sebelum menjalankan kueri, lihat pratinjau kueri untuk memperkirakan biaya.

Kueri ditagih sesuai jumlah byte yang dibaca. Untuk memperkirakan biaya sebelum menjalankan kueri:

Menggunakan validator kueri

Saat Anda memasukkan kueri di konsol Google Cloud, validator kueri akan memverifikasi sintaksis kueri dan memberikan estimasi jumlah byte yang dibaca. Anda dapat menggunakan estimasi ini untuk menghitung biaya kueri di kalkulator harga.

  • Jika kueri Anda tidak valid, validator kueri akan menampilkan pesan error. Contoh:

    Not found: Table myProject:myDataset.myTable was not found in location US

  • Jika kueri Anda valid, validator kueri akan memberikan estimasi jumlah byte yang diperlukan untuk memproses kueri. Contoh:

    This query will process 623.1 KiB when run.

Melakukan uji coba

Untuk melakukan uji coba, lakukan hal berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Masukkan kueri Anda di editor kueri.

    Jika kueri valid, tanda centang akan muncul secara otomatis bersama dengan jumlah data yang akan diproses oleh kueri. Jika kueri tidak valid, tanda seru akan muncul bersama dengan pesan error.

bq

Masukkan kueri seperti berikut menggunakan flag --dry_run.

bq query \
--use_legacy_sql=false \
--dry_run \
'SELECT
   COUNTRY,
   AIRPORT,
   IATA
 FROM
   `project_id`.dataset.airports
 LIMIT
   1000'
 

Untuk kueri yang valid, perintah tersebut menghasilkan respons berikut:

Query successfully validated. Assuming the tables are not modified,
running this query will process 10918 bytes of data.

API

Untuk melakukan uji coba menggunakan API, kirim tugas kueri dengan dryRun ditetapkan ke true pada jenis JobConfiguration.

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// queryDryRun demonstrates issuing a dry run query to validate query structure and
// provide an estimate of the bytes scanned.
func queryDryRun(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	q := client.Query(`
	SELECT
		name,
		COUNT(*) as name_count
	FROM ` + "`bigquery-public-data.usa_names.usa_1910_2013`" + `
	WHERE state = 'WA'
	GROUP BY name`)
	q.DryRun = true
	// Location must match that of the dataset(s) referenced in the query.
	q.Location = "US"

	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	// Dry run is not asynchronous, so get the latest status and statistics.
	status := job.LastStatus()
	if err := status.Err(); err != nil {
		return err
	}
	fmt.Fprintf(w, "This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobStatistics;
import com.google.cloud.bigquery.QueryJobConfiguration;

// Sample to run dry query on the table
public class QueryDryRun {

  public static void runQueryDryRun() {
    String query =
        "SELECT name, COUNT(*) as name_count "
            + "FROM `bigquery-public-data.usa_names.usa_1910_2013` "
            + "WHERE state = 'WA' "
            + "GROUP BY name";
    queryDryRun(query);
  }

  public static void queryDryRun(String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query).setDryRun(true).setUseQueryCache(false).build();

      Job job = bigquery.create(JobInfo.of(queryConfig));
      JobStatistics.QueryStatistics statistics = job.getStatistics();

      System.out.println(
          "Query dry run performed successfully." + statistics.getTotalBytesProcessed());
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function queryDryRun() {
  // Runs a dry query of the U.S. given names dataset for the state of Texas.

  const query = `SELECT name
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 100`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    dryRun: true,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);

  // Print the status and statistics
  console.log('Status:');
  console.log(job.metadata.status);
  console.log('\nJob Statistics:');
  console.log(job.metadata.statistics);
}

PHP

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan PHP di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery PHP API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

// Construct a BigQuery client object.
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);

// Set job configs
$jobConfig = $bigQuery->query($query);
$jobConfig->useQueryCache(false);
$jobConfig->dryRun(true);

// Extract query results
$queryJob = $bigQuery->startJob($jobConfig);
$info = $queryJob->info();

printf('This query will process %s bytes' . PHP_EOL, $info['statistics']['totalBytesProcessed']);

Python

Tetapkan properti QueryJobConfig.dry_run ke True. Client.query() selalu menampilkan QueryJob yang telah selesai saat diberi konfigurasi kueri uji coba.

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.QueryJobConfig(dry_run=True, use_query_cache=False)

# Start the query, passing in the extra configuration.
query_job = client.query(
    (
        "SELECT name, COUNT(*) as name_count "
        "FROM `bigquery-public-data.usa_names.usa_1910_2013` "
        "WHERE state = 'WA' "
        "GROUP BY name"
    ),
    job_config=job_config,
)  # Make an API request.

# A dry run query completes immediately.
print("This query will process {} bytes.".format(query_job.total_bytes_processed))

Menghindari menjalankan kueri untuk menjelajahi data tabel

Praktik terbaik: Jangan menjalankan kueri untuk menjelajahi atau melihat pratinjau data tabel.

Jika ingin bereksperimen atau mengeksplorasi data, Anda dapat menggunakan opsi pratinjau tabel untuk melihat data secara gratis dan tanpa memengaruhi kuota.

BigQuery mendukung opsi pratinjau data berikut:

  • Di konsol Google Cloud, pada halaman detail tabel, klik tab Pratinjau untuk mengambil sampel data.
  • Di alat command line bq, gunakan perintah bq head dan tentukan jumlah baris yang akan dilihat pratinjaunya.
  • Di API, gunakan tabledata.list untuk mengambil data tabel dari kumpulan baris yang ditentukan.
  • Hindari penggunaan LIMIT dalam tabel yang tidak dikelompokkan. Untuk tabel yang tidak dikelompokkan, klausa LIMIT tidak akan mengurangi biaya komputasi.

Membatasi jumlah byte yang ditagih

Praktik terbaik: Gunakan setelan penagihan byte maksimum untuk membatasi biaya kueri.

Anda dapat membatasi jumlah byte yang ditagih untuk kueri menggunakan setelan byte maksimum yang ditagih. Jika Anda menetapkan byte maksimum yang ditagih, jumlah byte yang dibaca kueri akan diperkirakan sebelum eksekusi kueri. Jika jumlah perkiraan byte melebihi batas, kueri akan dibatalkan tanpa penarikan biaya.

Untuk tabel yang dikelompokkan, estimasi jumlah byte yang ditagih untuk kueri adalah batas atas, dan dapat lebih tinggi dari jumlah byte sebenarnya yang ditagih setelah menjalankan kueri. Jadi dalam beberapa kasus, jika Anda menetapkan byte maksimum yang ditagih, kueri pada tabel yang dikelompokkan bisa gagal, meskipun byte sebenarnya yang ditagih tidak akan melebihi setelan byte maksimum yang ditagih.

Jika kueri gagal karena setelan byte maksimum yang ditagih, error yang serupa dengan yang berikut akan ditampilkan:

Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.

Untuk menetapkan byte maksimum yang ditagih:

Konsol

  1. Di Editor kueri, klik Lainnya > Setelan kueri > Opsi lanjutan.
  2. Di kolom Byte maksimum yang ditagih, masukkan bilangan bulat.
  3. Klik Simpan.

bq

Gunakan perintah bq query dengan flag --maximum_bytes_billed.

  bq query --maximum_bytes_billed=1000000 \
  --use_legacy_sql=false \
  'SELECT
     word
   FROM
     `bigquery-public-data`.samples.shakespeare'

API

Tetapkan properti maximumBytesBilled di JobConfigurationQuery atau QueryRequest.

Menghindari penggunaan LIMIT dalam tabel yang tidak dikelompokkan

Praktik terbaik: Untuk tabel yang tidak dikelompokkan, jangan gunakan klausa LIMIT sebagai metode kontrol biaya.

Untuk tabel yang tidak dikelompokkan, menerapkan klausa LIMIT ke kueri tidak akan memengaruhi jumlah data yang dibaca. Anda dikenai biaya untuk membaca semua byte di seluruh tabel seperti yang ditunjukkan oleh kueri, meskipun kueri hanya menampilkan subset. Dengan tabel yang dikelompokkan, klausa LIMIT dapat mengurangi jumlah byte yang dipindai, karena pemindaian akan berhenti saat blok yang dipindai sudah mencukupi untuk mendapatkan hasil. Anda hanya dikenai biaya untuk byte yang dipindai.

Melihat biaya menggunakan dasbor dan membuat kueri log audit Anda

Praktik terbaik: Buat dasbor untuk melihat data penagihan, sehingga Anda dapat melakukan penyesuaian pada penggunaan BigQuery. Pertimbangkan juga untuk menampilkan log audit secara bertahap ke BigQuery agar Anda dapat menganalisis pola penggunaan.

Anda dapat mengekspor data penagihan ke BigQuery dan memvisualisasikannya dalam alat seperti Looker Studio. Untuk tutorial tentang cara membuat dasbor penagihan, lihat Memvisualisasikan penagihan Google Cloud menggunakan BigQuery dan Looker Studio.

Anda juga dapat menampilkan log audit secara bertahap ke BigQuery dan menganalisis log untuk menemukan pola penggunaan, seperti biaya kueri berdasarkan pengguna.

Merealisasikan hasil kueri dalam tahapan

Praktik terbaik: Jika memungkinkan, realisasikan hasil kueri Anda secara bertahap.

Jika Anda membuat kueri multi-tahap yang besar, setiap kali Anda menjalankannya, BigQuery akan membaca semua data yang diperlukan oleh kueri tersebut. Anda akan ditagih untuk semua data yang dibaca setiap kali kueri dijalankan.

Sebagai gantinya, bagi kueri Anda ke dalam beberapa tahapan dengan setiap tahap merealisasikan hasil kueri dengan menuliskannya ke tabel tujuan. Membuat kueri tabel tujuan yang lebih kecil akan mengurangi jumlah data yang dibaca dan menurunkan biaya. Biaya penyimpanan hasil yang direalisasikan jauh lebih murah daripada biaya pemrosesan data dalam jumlah besar.

Menggunakan masa berlaku tabel untuk tabel tujuan

Praktik terbaik: Jika Anda menulis hasil kueri yang besar ke tabel tujuan, gunakan waktu habis masa berlaku tabel default untuk menghapus data saat tidak diperlukan lagi.

Menyimpan kumpulan hasil yang besar dalam penyimpanan BigQuery memerlukan biaya. Jika Anda tidak memerlukan akses permanen ke hasil, gunakan masa berlaku tabel default untuk menghapus data Anda secara otomatis.

Untuk informasi selengkapnya, lihat harga penyimpanan.

Langkah berikutnya