Как работает кэширование в Snowflake

Автоматизация конвейеров данных в Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Три уровня кэширования

Уровни кэширования.png

Snowflake кэширует результаты на трёх уровнях — каждый имеет свой охват и время жизни

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

Когда используется кэш результатов (и когда нет)

Схема потока кэша результатов Snowflake: запрос мгновенно возвращает кэшированный результат пользователю

Условие Промах кэша, если…
Текст запроса совпадает точно Различается регистр, пробелы или псевдонимы
Нет нерезервируемых функций Функции, изменяющиеся между запусками: RANDOM
Базовые таблицы не изменены DML, рекластеризация или консолидация после последнего запуска
Сохранённый результат доступен Истёк TTL 24 часа без повторного использования или 31 день
Роль имеет необходимые привилегии SELECT: роль без привилегий; SHOW: другая роль
Автоматизация конвейеров данных в Snowflake

Кэш хранилища и кэш метаданных

Схема кэша данных Snowflake: попадание и промах в кэш хранилища

Кэш хранилища

  • Хранит недавно считанные микроразделы на SSD и в памяти хранилища
  • Очищается при приостановке хранилища
  • Устанавливайте достаточно долгое время до автоприостановки, чтобы сохранить кэш

Кэш метаданных

  • Всегда активен, располагается в облачных сервисах
  • Хранит статистику таблиц
  • Некоторые запросы выполняются только на основе метаданных
Автоматизация конвейеров данных в 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 *

-- 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';

Избегайте неявных перекрёстных соединений

-- 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;
Автоматизация конвейеров данных в Snowflake

Lass uns üben!

Автоматизация конвейеров данных в Snowflake

Preparing Video For Download...