İndeks yerine bölümleme ve kümeleme
BigQuery'de klasik indeks yoktur. Büyük tablolarda okunan veriyi azaltmanın iki aracı vardır:
- Bölümleme (partitioning): Tablo tarih (veya tam sayı aralığı) sütununa göre bölümlere ayrılır.
WHERE order_date >= '2024-12-01'yalnızca ilgili bölümleri okur.require_partition_filterseçeneği, tarih filtresi olmayan sorguları reddeder. - Kümeleme (clustering): Bölüm içinde veri, en fazla 4 sütuna göre sıralı saklanır. Bu sütunlarla filtrelemek okunan bloğu azaltır.
CREATE TABLE siparis_bolumlu PARTITION BY order_date CLUSTER BY channel, status AS SELECT * FROM orders; SELECT channel, COUNT(*) AS siparis FROM siparis_bolumlu WHERE order_date >= '2024-12-01' AND status = 'delivered' GROUP BY channel;
Bu uygulamadaPARTITION BY ve CLUSTER BY sözdizimi kabul edilir ama tarayıcıdaki motor fiziksel bölümleme yapmaz; sonuçlar aynıdır.
Maliyet kontrol listesi
SELECT *kullanma; sütunları adıyla seç.- Bölüm filtresini daima yaz; tarih sütununu fonksiyona sokma (
DATE(order_date) = ...yerine aralık). - Sık çalışan özet sorgular için materialized view kullan; BigQuery değişen kısmı artımlı günceller.
- Aynı sorgu 24 saat içinde tekrar çalışırsa önbellekten ücretsiz döner (tablo değişmediyse).
- Kesin olması gerekmeyen sayımlarda
APPROX_COUNT_DISTINCTçok daha ucuzdur. - Geliştirirken “maximum bytes billed” sınırı koy.
-- Son 7 günde en çok veri tarayan sorgular
SELECT user_email,
ROUND(total_bytes_billed / POW(1024, 4), 3) AS tb,
LEFT(query, 120) AS sorgu
FROM `region-eu`.INFORMATION_SCHEMA.JOBS
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND job_type = 'QUERY'
ORDER BY total_bytes_billed DESC
LIMIT 10;
Fiyatlandırma modelleri
İsteğe bağlı modelde taranan bayt başına, kapasite (Editions) modelinde ayrılan işlem gücü (slot) başına ödenir. Güncel fiyatlar bölgeye göre değişir; Google Cloud'un fiyat sayfasından kontrol et.