BigQuery nedir?
BigQuery, Google Cloud'un sunucusuz (serverless) veri ambarıdır: sunucu kurmaz, indeks oluşturmazsın; terabaytlarca veriyi saniyeler içinde tarayan sorgular yazarsın. Google Analytics 4 ve Google Ads verilerinin doğrudan aktarıldığı yer olduğu için pazarlama ve ürün analitiğinde çok yaygındır. Dili GoogleSQL'dir (standart SQL'e yakın).
Varsayılan SQL türü BigQuery yaparsan tüm derslerdeki sorgular BigQuery yazımıyla gösterilir; her kod kutusunda BigQuery sekmesi de vardır.
Adlandırma: proje.veri_seti.tablo
SELECT order_id, order_date FROM `sirket-proje.anadolu.orders` WHERE order_date >= '2024-12-01';
Gerçek BigQuery'de tablo adı veri setiyle (çoğu zaman projeyle de) yazılır ve ters tırnak kullanılır. Bu uygulamada anadolu veri seti varsayılan olduğu için kısaca orders yazabilirsin; anadolu.orders da çalışır.
Maliyet: taranan veri kadar öde
İsteğe bağlı (on-demand) fiyatlandırmada ödediğin tutar, sorgunun taradığı bayt miktarına göre hesaplanır. BigQuery sütun tabanlı sakladığı için:
SELECT *tüm sütunları okur, pahalıdır. Yalnızca gereken sütunları seç.LIMITtaranan veriyi azaltmaz; tüm sütunu okur, sonra keser.- Bölümlenmiş (partitioned) tabloda tarih filtresi okunan bölümleri azaltır.
- Sorguyu çalıştırmadan önce editör “bu sorgu X GB işleyecek” diye tahmini gösterir (dry run).
Diğer SQL türlerinden farklar
| Konu | BigQuery |
|---|---|
| Küme işlemleri | UNION ALL veya UNION DISTINCT; çıplak UNION hata verir |
| Bölme | / her zaman ondalıklı; tam sayı bölmesi DIV(a, b), sıfıra güvenli bölme SAFE_DIVIDE(a, b) |
| Kalan | % yok, MOD(a, b) |
| Tarih | DATE_ADD(d, INTERVAL 1 MONTH), DATE_DIFF(bitis, baslangic, DAY), DATE_TRUNC(d, MONTH), FORMAT_DATE('%Y-%m', d) |
| Tipler | INT64, FLOAT64, NUMERIC, STRING, DATE, DATETIME, TIMESTAMP, BOOL, ARRAY, STRUCT |
| Hata yerine NULL | SAFE_CAST, SAFE_DIVIDE, SAFE.PARSE_DATE |
| Koşullu | IF(koşul, a, b), COUNTIF(koşul) |
| Kısıtlar | PRIMARY KEY / FOREIGN KEY yalnızca NOT ENFORCED; UNIQUE, CHECK, indeks ve trigger yok |
| DML | UPDATE ve DELETE her zaman WHERE ister (WHERE true) |
Tipik bir BigQuery sorgusu
SELECT FORMAT_DATE('%Y-%m', order_date) AS ay,
COUNT(*) AS siparis,
COUNTIF(status = 'cancelled') AS iptal,
ROUND(SAFE_DIVIDE(COUNTIF(status = 'cancelled'), COUNT(*)) * 100, 1) AS iptal_orani
FROM anadolu.orders
WHERE order_date >= '2024-07-01'
GROUP BY ay
ORDER BY ay;