Як працює кешування в Snowflake

Автоматизація конвеєрів даних у Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Три рівні кешування

Рівні кешування.png

Snowflake кешує результати на трьох рівнях — з різною зоною дії й тривалістю

  • Кеш результатів — зберігає повні результати запитів і повертає їх без запуску складу
  • Кеш складу (даних) — нещодавно проскановані мікророзділи в пам’яті та на SSD
  • Кеш метаданих — завжди увімкнений; статистика таблиць для планування запитів
Автоматизація конвеєрів даних у Snowflake

Коли використовується кеш результатів (а коли ні)

Схема потоку кешу результатів Snowflake, що показує миттєве повернення кешованого результату користувачу

Умова Кеш пропускається, коли…
Текст запиту збігається точно Різняться регістр, пробіли або псевдоніми
Без невідтворюваних функцій функції, що змінюються між запусками: RANDOM
Базові таблиці не змінені DML, перекластеризація або консолідація після останнього запуску
Збережений результат досі доступний TTL 24 год вичерпано без повторного використання, або 31 день
Роль має потрібні привілеї SELECT: ролі бракує привілеїв SHOW: інша роль
Автоматизація конвеєрів даних у Snowflake

Кеш складу та кеш метаданих

Схема кешу даних Snowflake, що показує сценарії влучання та промаху кешу складу

Кеш складу

  • Зберігає нещодавно проскановані мікророзділи на SSD складу та в пам’яті
  • Очищається під час призупинення складу
  • Встановіть авто-призупинення достатньо довгим, щоб зберегти кеш

Кеш метаданих

  • Завжди увімкнений, живе в Cloud Services
  • Зберігає статистику таблиць
  • Деякі запити відповідаються лише з метаданих
Автоматизація конвеєрів даних у Snowflake

SQL-патерни, що заважають обрізанню розділів

Заважає обрізанню розділів:

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

Дозволяє обрізання розділів:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Автоматизація конвеєрів даних у Snowflake

Ще два SQL-патерни, яких слід уникати

Уникайте SELECT *

-- Читає всі стовпці
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Читає лише потрібне
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Уникайте неявних крос-джоїнів

-- Відсутня умова JOIN = декартів добуток
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- Явний JOIN з умовою ON
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Автоматизація конвеєрів даних у Snowflake

Перейдемо до практики!

Автоматизація конвеєрів даних у Snowflake

Preparing Video For Download...