การทำงานของ Caching ใน Snowflake

การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

สามชั้นของ Caching

ชั้น Caching

Snowflake แคชผลลัพธ์ สามระดับ — แต่ละระดับมีขอบเขตและระยะเวลาต่างกัน

  • Result cache — เก็บผลลัพธ์ Query ทั้งหมดและส่งคืนโดยไม่ต้องรัน Warehouse
  • Warehouse/Data cache — Micro-partition ที่สแกนล่าสุดในหน่วยความจำและ SSD
  • Metadata cache — เปิดตลอดเวลา ใช้สถิติตารางในการวางแผน Query
การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

เมื่อใดที่ Result Cache ถูกใช้งาน (และเมื่อใดที่ไม่ใช้)

แผนภาพ Snowflake Query Result Cache แสดงการส่งคืนผลลัพธ์จาก Cache ทันที

เงื่อนไข Cache Miss เมื่อ…
ข้อความ Query ตรงกันทุกประการ ตัวพิมพ์ เว้นวรรค หรือ Alias ต่างกัน
ไม่มีฟังก์ชันที่ใช้ซ้ำไม่ได้ ฟังก์ชันที่เปลี่ยนระหว่างรัน: RANDOM
ตารางต้นทางไม่มีการเปลี่ยนแปลง DML, Reclustering หรือการรวมข้อมูลหลังรันล่าสุด
ผลลัพธ์ที่บันทึกยังใช้งานได้ TTL 24 ชั่วโมงหมดโดยไม่มีการใช้งาน หรือครบ 31 วัน
Role มีสิทธิ์ที่จำเป็น SELECT: Role ไม่มีสิทธิ์ SHOW: Role ต่างกัน
การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

Warehouse Cache และ Metadata Cache

แผนภาพ Snowflake Data Cache แสดงสถานการณ์ Cache Hit และ Cache Miss

Warehouse Cache

  • เก็บ Micro-partition ที่สแกนล่าสุดบน SSD และหน่วยความจำของ Warehouse
  • ถูกล้างเมื่อ Warehouse หยุดทำงาน
  • ตั้งค่า Auto-suspend ให้นานพอเพื่อรักษา Cache

Metadata Cache

  • เปิดตลอดเวลา อยู่ใน Cloud Services
  • เก็บสถิติตาราง
  • บาง Query ตอบได้จาก Metadata เพียงอย่างเดียว
การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

รูปแบบ SQL ที่ขัดขวาง Partition Pruning

ป้องกันการ Pruning:

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

อนุญาตให้ Pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

รูปแบบ SQL อีกสองแบบที่ควรหลีกเลี่ยง

หลีกเลี่ยง SELECT *

-- Reads every column
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Reads only what's needed
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

หลีกเลี่ยง Implicit Cross-join

-- Missing join condition = Cartesian
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- Explicit JOIN with ON condition
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

มาฝึกกันเลย!

การทำให้ Data Pipeline เป็นอัตโนมัติใน Snowflake

Preparing Video For Download...