Cara Kerja Caching di Snowflake

Otomatisasi Data Pipeline di Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Tiga Lapisan Caching

Lapisan caching.png

Snowflake melakukan cache hasil pada tiga level — masing-masing dengan cakupan dan durasi berbeda

  • Result cache — menyimpan hasil query lengkap dan mengembalikannya tanpa menyalakan warehouse
  • Warehouse/data cache — micro-partition yang baru dipindai di memori dan SSD
  • Metadata cache — selalu aktif; statistik tabel untuk perencanaan query
Otomatisasi Data Pipeline di Snowflake

Kapan Result Cache dipakai (dan tidak)

Diagram alur Snowflake Query Result Cache yang menunjukkan query mengembalikan hasil cache instan ke pengguna

Kondisi Cache Miss Ketika…
Teks query persis sama Huruf besar/kecil, spasi, atau alias berbeda
Tanpa fungsi tidak-reusable fungsi yang berubah tiap run: RANDOM
Tabel dasar tidak berubah Ada DML, reclustering, atau konsolidasi sejak run terakhir
Hasil tersimpan masih tersedia TTL 24 jam habis tanpa dipakai ulang, atau 31 hari
Role punya hak yang diperlukan SELECT: role kurang hak SHOW: role berbeda
Otomatisasi Data Pipeline di Snowflake

Warehouse cache dan Metadata cache

Diagram data cache Snowflake yang menunjukkan skenario cache hit versus cache miss di warehouse

Warehouse cache

  • Menyimpan micro-partition yang baru dipindai di SSD + memori warehouse
  • Dibersihkan saat warehouse disuspensi
  • Atur auto-suspend cukup lama agar cache tetap ada

Metadata cache

  • Selalu aktif, di Cloud Services
  • Menyimpan statistik tabel
  • Beberapa query dijawab dari metadata saja
Otomatisasi Data Pipeline di Snowflake

Pola SQL yang Mencegah Partition Pruning

Mencegah pruning:

SELECT *
FROM logistics.shipments
WHERE MONTH(dispatch_date) = 3;

Memungkinkan pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Otomatisasi Data Pipeline di Snowflake

Dua pola SQL lain yang perlu dihindari

Hindari SELECT *

-- Membaca semua kolom
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Hanya baca yang diperlukan
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Hindari cross-join implisit

-- Tanpa kondisi join = Kartesius
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- JOIN eksplisit dengan ON
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Otomatisasi Data Pipeline di Snowflake

Ayo berlatih!

Otomatisasi Data Pipeline di Snowflake

Preparing Video For Download...