В мире больших данных
218 subscribers
34 photos
5 files
54 links
Полезные заметки о системном анализе в мире больших данных. Если вам интересны Big Data, DWH, SQL и как навести порядок в данных — заглядывайте. Будет интересно и по делу.

Автор: @JuliaMur
Download Telegram
Коротко о Snowflake

— Облачное хранилище данных и аналитическая платформа
— Трёхслойная архитектура: хранение, вычисление и сервисы
— Масштабируемость и производительность
— Лёгкая управляемость
— Высокая доступность и отказоустойчивость
— Автоматическая организация и сжатие данных
— Экономическая эффективность
— Колоночное хранение
Snowflake SQL соответствует ANSI SQL и в целом очень похож на PostgreSQL

#snowflake
1
Краткий обзор архитектуры Snowflake для начинающих

Snowflake создан специально для сложного мира аналитики данных. Давайте рассмотрим его архитектуру, чтобы лучше понимать, что же происходит под капотом.

Архитектура Snowflake представляет собой гибрид традиционных баз данных с shared-nothing архитектурой.

Три независимых уровня:
1. Общий уровень хранения — служит основой, где хранятся данные. Автоматически организует и уменьшает размер данных для быстрого доступа и анализа.

2. Слой вычислений (виртуальные warehouse) — место, где запросы обрабатываются и преобразуются в результаты. Обеспечивает эффективное извлечение данных и вычисления. В Snowflake есть возможность использовать только то количество вычислительных ресурсов, которое необходимо для текущей рабочей нагрузки.

3. Слой облачных сервисов — управляет важными службами, такими как оптимизация запросов, безопасность и метаданные, обеспечивая согласованную и безопасную среду данных. Этот уровень предназначен для быстрого, безопасного и надежного взаимодействия с пользователем.

Эта архитектура обеспечивает оптимальное использование ресурсов, хранение и обработку данных. При этом компоненты архитектуры работают без взаимной зависимости.

Преимущества архитектуры:
— производительность
— улучшенная масштабируемость
— оптимизация затрат

Архитектура Snowflake создана для эффективной и удобной обработки данных. Это делает Snowflake многофункциональным решением для сложных запросов в области аналитики данных.

#snowflake
2
Путешествия во времени вместе со Snowflake

Одна из крутых функций Snowflake — это Time Travel, позволяющая "путешествовать во времени" для восстановления данных, которые были изменены или удалены в прошлом. Теперь уничтожить данные безвозвратно будет не так просто 😅

Основные возможности Time Travel
Запрос данных из прошлого.
Можно выполнять запросы к данным, которые были обновлены или удалены. Это уникальная возможность анализа и восстановления информации на разных исторических этапах БД.

Пример запроса, вытягивающего исторические данные по состоянию на 10 минут назад:
SELECT * 
FROM table_name AT(OFFSET => -60*10);


Создание клонов таблиц, схем и БД. Time Travel позволяет создавать клонированные копии на определенный момент в прошлом. Это полезно для анализа и восстановления состояния данных за конкретный временной отрезок.

Пример создания клона таблицы с указанной меткой времени:
CREATE TABLE restored_table CLONE table_name
AT(TIMESTAMP => 'Fri, 29 Dec 2023 00:00:00 +0500'::timestamp_tz);


Восстановление удаленных объектов. Теперь можно восстанавливать случайно удаленные таблицы, схемы и базы данных.

Пример просмотра удалённых таблиц:
SHOW TABLES HISTORY LIKE 'old%' IN db_name.schema_name;


Восстановление удалённой таблицы:
UNDROP TABLE table_name;

! Если объект с таким же именем уже есть в базе, то восстановление невозможно, необходимо переименовать новый объект до восстановления.

Как это работает?
Snowflake сохраняет состояние данных перед выполнением операций над ними.

Сколько хранятся данные?
Всё зависит от версии подписки на Snowflake. Для Standard срок хранения составляет всего 1 день. А для Enterprise-версии — от 1 до 90 дней для стандартных таблиц. Snowflake позволяет настроить срок хранения на уровне объекта.

Time Travel — это инструмент для обеспечения целостности и восстановления данных, который предоставляет уникальные возможности работы с исторической информацией.

Дополнительную информацию о функции Time Travel можно прочитать в доке.

#snowflake
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Snowflake pricing: стоимость хранения и обработки данных

Давно ничего не писала о Snowflake, а ведь сейчас это основная платформа с которой я работаю. Ранее я рассказывала об архитектуре Snowflake, а теперь хочу затронуть не менее важную тему — расчет оплаты за его использование.

Snowflake не требует покупки или аренды физического оборудования. Это облачное решение, где вы платите за потребляемые ресурсы — модель pay-as-you-go. Это одно из его основных преимуществ, которое легко может превратиться в недостаток, если использовать хранилище как попало. Наша задача не просто загружать и обновлять данные, строить витрины, но и делать это максимально экономно. Про особенности оплаты хорошо описано в доках, но всё-таки подчеркну здесь основные моменты.

Snowflake берет плату за хранение данных в зависимости от региона и облачного провайдера (AWS, Azure или GCP). Оплата идет за терабайт в месяц и бывает двух типов:
• On-demand storage — платим только за фактический объем данных.
• Capacity storage — предоплата за объем на год вперёд с возможной экономией до 30%. Однако неиспользованный объем никак не компенсируется.
При этом стоит упомянуть, что в любом из вариантов загружаемые данные автоматически сжимаются, что снижает оплачиваемый объем.

Теперь про обработку данных и тут начинается самое интересное. Вычислительные мощности Snowflake — это виртуальные склады (warehouses). Они обрабатывают запросы и выполняют преобразования данных. Оплата идет в кредитах, и вот как это работает:
Snowflake предлагает разные размеры warehouses. Чем он больше, тем выше его вычислительная мощность и тем больше кредитов он потребляет в час.
• При этом мы платим только за время, когда warehouse активен. Если он простаивает несколько минут, то автоматически приостанавливается.
• Стоимость кредита зависит от выбранного плана и облачного провайдера.

С передачей данных все просто: внутри одного региона она бесплатна. Но есть нюансы:
• межрегиональная передача между дата-центрами облачных провайдеров оплачивается отдельно и стоит несколько центов за гигабайт;
• выгрузка данных во внешние системы — доп.плата;
• межоблачная передача (например, между AWS и GCP) также оплачивается.

Как оптимизировать расходы?
1. Настроить быстрое «засыпание» warehouses после выполнения пачки задач.
2. Группировать выполнение системных задач.
3. Разделить warehouses для тех. процессов и задач аналитики, правильно подобрав размер под каждый тип задач. Большой warehouse работает быстрее, но и стоит дороже.
4. Использовать автоматическое масштабирование там, где это необходимо — Snowflake может автоматически увеличивать и уменьшать размер warehouse в зависимости от нагрузки.
5. Оптимизировать запросы, ведь неэффективные запросы — прямой путь к лишним расходам.
6. Использовать кэширование результатов — Snowflake кэширует результаты запросов, т.е. если запрос повторяется, результат берется из кэша, что экономит ресурсы.
7. Ну и, конечно, мониторить использование. Snowflake предоставляет подробные отчеты, и хорошо бы регулярно проверять их, чтобы понимать, где можно оптимизировать затраты.

Ценообразование в Snowflake — это целая наука и отдельный проект для анализа и планирования. Выше я описала основы, знание которых поможет немного понять принципы и эффективнее управлять расходами, получая максимум от Snowflake.

#snowflake
31
TABLE_DML_HISTORY: окно в мир изменений ваших данных

Вьюха TABLE_DML_HISTORY в Snowflake — инструмент, который помогает отслеживать и анализировать DML-операции (Data Manipulation Language) в таблицах. По сути он выводит агрегированную информацию о влиянии DML-операций на ваши данные.

Вот что там можно узнать:
🔵 какие таблицы изменялись
🔵 временные интервалы, в которые происходили изменения
🔵 количество добавленных, удаленных и обновленных строк

Предположим, вы хотите узнать, какие изменения были внесены в таблицу SALES за последние 24 часа. Для этого можно выполнить следующий запрос:

SELECT
START_TIME,
END_TIME,
ROWS_ADDED,
ROWS_UPDATED,
ROWS_REMOVED
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_DML_HISTORY
WHERE TABLE_NAME = 'SALES'
AND START_TIME >= DATEADD('day', -1, CURRENT_TIMESTAMP())
ORDER BY START_TIME DESC;


Если нужно проанализировать изменения во всех таблицах определенной схемы за месяц, можно использовать такой запрос:

SELECT
TABLE_NAME,
SUM(ROWS_ADDED) AS TOTAL_ROWS_ADDED,
SUM(ROWS_UPDATED) AS TOTAL_ROWS_UPDATED,
SUM(ROWS_REMOVED) AS TOTAL_ROWS_REMOVED
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_DML_HISTORY
WHERE SCHEMA_NAME = 'SANDBOX'
AND START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP())
GROUP BY TABLE_NAME;


Но не бывает крутых функций без нюансов и ограничений. TABLE_DML_HISTORY:
🔵 содержит информацию по всем DML-операциям, выполненным за последние 365 дней;
🔵 задержка обновления данных может составлять до 6 часов;
🔵 не включает DML-операции на гибридных таблицах
🔵 доступ к этому представлению зависит от привилегий пользователя, обычно требуется роль ACCOUNTADMIN или соответствующие права на чтение из схемы ACCOUNT_USAGE.

Советы по использованию:
🔵мониторинг активности: регулярное отслеживание DML-операций помогает выявлять аномальные изменения и потенциальные проблемы с данными.
🔵аудит изменений: можно проводить аудит изменений в важных таблицах для обеспечения соответствия внутренним политикам и внешним требованиям.
🔵оптимизация производительности: анализ частоты и объема DML-операций может помочь в оптимизации запросов и пайплайнов.

TABLE_DML_HISTORY — хороший инструмент для мониторинга и аудита данных в Snowflake. Используйте его, чтобы лучше понимать, что происходит с вашими данными и вовремя вносить изменения в неоптимальные процессы.

Более подробную информацию вы всегда можете найти в официальной документации Snowflake.

#dwh #snowflake
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько стоит твой SQL запрос?

Облачные хранилища — это гибкость и масштабируемость, простота и скорость работы 🤩 Но кроме этого — вечно растущие расходы. С каждым днём мы грузим всё больше данных, придумываем сложные расчёты и наши расходы растут 📈 Иногда вычислить что (и кто) тратит денежки компании особенно усердно — целое искусство.

Чтобы немного помочь с этой болью, Snowflake добавил новую системную таблицу — QUERY_ATTRIBUTION_HISTORY. Она позволяет решать целый ряд задач:
🔵cколько кредитов "съел" конкретный пользователь?
🔵во сколько обходится тот или иной пайплайн?
🔵какие запросы повторяются и сколько они стоят?

То есть она помогает обнаружить скрытые источники перерасхода. Например, простой SELECT, который запускается каждые пять минут, может стоить намного больше, чем ожидалось. Выявили проблему — сразу оптимизировали. Больше не нужно составлять сложные SQL-запросы, объединяя данные из нескольких таблиц. При этом вся информация хранится год, и доступ к ней можно получить всего за несколько строк кода.

Для вычисления самых злостных потребителей за последний месяц достаточно выполнить запрос:

SELECT user_name, SUM(credits_attributed_compute) AS credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
WHERE 1=1
AND start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
AND start_time < CURRENT_DATE
GROUP BY user_name
ORDER BY credits desc;


Теперь можно легко настроить дашборды и ещё лучше:
— анализировать расходы
— оптимизировать задачи, которые дороже всего стоят
— создать систему уведомлений о высоких расходах.

Что стоит помнить? Не учитываются:
🔵расходы на простои виртуальных варехаузов (про них я рассказывала в одной из статей про #snowflake)
🔵serverless-функции
🔵хранение данных

Документация по QUERY_ATTRIBUTION_HISTORY здесь.

#snowflake
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Обожаю Snowflake за множество классных функций, делающих sql-код более читабельным. При этом специально "переучиваться" для работы в снежке не нужно, так как он поддерживает всем знакомый (ну я надеюсь) стандарт ANSI SQL. Просто каждый раз в работе (или листая документацию) ты находишь прикольные фишки, которые хочется использовать.

Например, как бы вы посчитали, сколько задач разработчиков завершено до дедлайна, а сколько — нет? Обычно пришлось бы писать что-то вроде:

SELECT
developer,
SUM(CASE WHEN completion_date <= deadline THEN 1 ELSE 0 END) AS on_time_tasks,
SUM(CASE WHEN completion_date > deadline THEN 1 ELSE 0 END) AS late_tasks
FROM tasks
GROUP BY developer;


В Snowflake этот подсчёт выглядит куда лаконичнее:

SELECT
developer,
COUNT_IF(completion_date <= deadline) AS on_time_tasks,
COUNT_IF(completion_date > deadline) AS late_tasks
FROM tasks
GROUP BY developer;


Кажется, что это незначительная мелочь? Но насколько приятнее и понятнее становится разбирать тысячи строк какого-нибудь сложного аналитического запроса. Краткость — сила!

#snowflake #sql
👍2🔥1
NULL_COUNT и NULL_PERCENT для мониторинга качества данных в Snowflake

Я уже много раз упоминала, что от данных в DWH не будет никакого смысла, если мы не сможем им доверять. Что нужно для доверия? Регулярный мониторинг за качеством данных. Data quality должно пронизывать все этапы жизни данных в хранилище. И об этом говорить мы будем ещё очень много. Но сегодня я хочу рассказать о классных плюшках в Snowflake, которые чуть упрощают нам некоторые проверки.

В Snowflake есть много встроенных встроенных метрик помогающих отслеживать качество данных. И функция SYSTEM$DATA_METRIC_SCAN как раз одна из них. Она упрощает получение метрик качества данных без необходимости писать сложные запросы.

Например, функция NULL_COUNT возвращает строки в таблице, которые содержат значение NULL в определенном столбце. А NULL_PERCENT помогает посчитать % NULL-значений от общего количества строк. Почему не использовать выборку по условию WHERE column_name is NULL? В рамках разовых точечных расчётов, использование этих встроенных метрик не даёт заметного прироста производительности. А вот вывести несколько метрик разом по одной таблице или одним запросом по нескольким быстрее-проще, используя функции.

Какие метрики можно посмотреть в рамках SYSTEM$DATA_METRIC_SCAN?
🟢 NULL_COUNT — количество NULL-значений в поле
🟢 NULL_PERCENT — % NULL-значений от общего количества строк
🟢 BLANK_COUNT — количество пустых строк (для текстовых полей)
🟢 BLANK_PERCENT — % пустых строк от общего количества строк
🟢 DUPLICATE_COUNT — количество дублей поля (не целиком строки)

Рассмотрим пример. Есть таблица с данными о заказах, куда через ELT-процесс регулярно льются свежие данные:

CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
product_id NUMBER,
order_date DATE,
delivery_date DATE,
amount NUMBER,
promo_code STRING
);

-- Для нашего примера заполним её тестовыми данными:
INSERT INTO orders VALUES
(1, 100, 500, '2024-01-01', '2024-01-03', 1500, NULL),
(2, 101, 501, '2024-01-01', NULL, 2000, 'WINTER24'),
(3, 102, 502, '2024-01-02', '2024-01-04', 1800, ''),
(4, NULL, 501, '2024-01-02', NULL, 2000, NULL);

-- Посчитаем какой % NULL-значений в поле customer_id и % пустых строк в promo_code
SELECT
SNOWFLAKE.CORE.NULL_PERCENT(SELECT customer_id
FROM orders) as null_percent_customer_id,
SNOWFLAKE.CORE.BLANK_PERCENT(SELECT promo_code
FROM orders) as blank_percent_promo_cd;

--Выведем все строки с BLANK-значениями в поле promo_code
SELECT *
FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
REF_ENTITY_NAME => 'orders',
METRIC_NAME => 'snowflake.core.blank_count',
ARGUMENT_NAME => 'promo_code'
));


Результат первого запроса покажет:

| null_percent_customer_id | blank_percent_promo_cd |
|--------------------------|------------------------|
| 25 | 33,33 |


А второй выведет строки таблицы с promo_code = '' целиком.

Как всё это применять?
🔘определение пороговых значений для NULL и BLANK в критичных колонках
🔘настройка регулярного мониторинга
🔘создание алертов на основе результатов проверок

Использование этой функции (с умом) позволяет нам быстро и просто находить аномалии в данных и реагировать на проблемы до того, как они повлияют на бизнес-процессы. Но даже если вы не используете Snowflake, не забывайте строить метрики качества другими методами.

#snowflake #data_quality
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42
Занималась тут оптимизацией чужого запроса. И вот вроде бы знаешь базу и хочешь её применить, но оптимизатор всегда оказывается хитрее 🙂

Среди прочего, пыталась применить одно из главных правил оптимизации — predicate pushdown. Это когда мы поднимаем условия фильтрации как можно выше, чтобы заранее уменьшить объем данных. Так вот, вынесла в cte фильтрацию одной таблички (~2GB), а в другом cte уже шла работа с отфильтрованными данными — джойны и тп. Смотрю в план запроса и вижу фигу, что снежок (snowflake) всё равно сначала сканирует таблицу целиком, затем джойнит, и только после этого фильтрует 😵 причём аналогичный сценарий на другой, но бОльшей таблице (~в 8GB) отрабатывает как надо 🥲 Видимо, размер данных или внутренняя статистика влияют на решения cost-based оптимизатора.

Никаких инсайтов в этой заметке вам не дам, но в очередной раз убеждаюсь: важно уметь читать (и понимать) планы запросов и анализировать query profile. Не всегда логичные на первый взгляд шаги оптимизации работают как ожидается. И не только от СУБД к СУБД поведение может разительно отличаться, но и даже в рамках таблиц в одном хранилище. Экспериментируйте и тестируйте на реальных данных 🤖

P.S. Тем, кто хочет использовать для анализа планов гпт, всё же советую сначала самостоятельно научиться их читать, т.к. LLM всё ещё склонны к галлюцинациям. Как говорится: "на ИИ надейся, да сам не плошай".

#sql #snowflake
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12