Ключи кластера можно определить при создании таблицы (с помощью команды CREATE TABLE) или позже (командой ALTER TABLE). Ключ кластеризации для таблицы также можно изменить или удалить в любое время.
Преимущества определения ключей кластеризации (для очень больших таблиц)
Использование ключа кластеризации для размещения похожих строк в одних и тех же микро-разделах дает несколько преимуществ для очень больших таблиц, в том числе:
Повышена эффективность сканирования в запросах за счет пропуска данных, не соответствующих предикатам фильтрации.
Лучшее сжатие столбцов, чем в таблицах без кластеризации. Это особенно верно, когда другие столбцы сильно коррелированы со столбцами, составляющими ключ кластеризации.
После того, как ключ был определен в таблице, дополнительное администрирование не требуется, если только вы не выбрали удаление или изменение ключа. Все последующее обслуживание строк в таблице (для обеспечения оптимальной кластеризации) выполняется Snowflake автоматически.
Хотя кластеризация может существенно повысить производительность и снизить стоимость некоторых запросов, вычислительные ресурсы, используемые для выполнения кластеризации, потребляют кредиты. Таким образом, вам следует кластеризовать только тогда, когда запросы существенно выиграют от кластеризации.
Обычно запросы выигрывают от кластеризации, когда запросы фильтруют или сортируют по ключу кластеризации для таблицы. Сортировка обычно выполняется для операций, операций и некоторых объединений. Например, следующее соединение, скорее всего, заставит Snowflake выполнить операцию сортировки: ORDER BYGROUP BY
select ...
from my_table inner join my_materialized_view
on my materialized view. Col 1 = my table. col1
...
В этом псевдо-примере Snowflake, скорее всего, сортирует значения в my_materialized_view.col 1 или my_table. col1. Например, если значения в my_table. col1сортируются, то во время сканирования материализованного представления Snowflake может быстро найти соответствующую строку в my_table.
Чем чаще запрашивается таблица, тем больше преимуществ дает кластеризация. Однако, чем чаще таблица изменяется, тем дороже будет содержать ее в кластере. Таким образом, кластеризация обычно наиболее рентабельна для таблиц, которые часто запрашиваются и не часто меняются.
Стратегии выбора ключей кластеризации
Один ключ кластеризации может содержать один или несколько столбцов или выражений. Для большинства таблиц Snowflake рекомендует использовать максимум 3 или 4 столбца (или выражения) на ключ. Добавление более 3-4 столбцов ведет к увеличению затрат больше, чем преимуществ.
Выбор правильных столбцов / выражений для ключа кластеризации может существенно повлиять на производительность запроса. Анализ вашей рабочей нагрузки обычно дает хороших ключевых кандидатов для кластеризации.
Snowflake рекомендует расположить ключи по приоритету в следующем порядке:
Кластерные столбцы, наиболее активно используемые в выборочных фильтрах. Для многих таблиц фактов, задействованных в запросах на основе даты (например, «WHERE invoice_date> x AND invoice date <= y»), выбор столбца даты является хорошей идеей. Для таблиц событий тип события может быть хорошим выбором, если существует большое количество различных типов событий. (Если в вашей таблице есть только небольшое количество различных типов событий, просмотрите комментарии по количеству элементов ниже, прежде чем выбирать столбец событий в качестве ключа кластеризации.)
Если есть место для дополнительных ключей кластера, рассмотрите столбцы, часто используемые в предикатах соединения, например «FROM table1 JOIN table2 ON table2.column_A = table1.column_B».
Если вы обычно фильтровать запросы по двум измерениям (например, application_idи user_statusстолбцы), то кластеризация на оба колонках может повысить производительность.
Количество различных значений (т. Е. Количество элементов) в столбце / выражении является критическим аспектом его выбора в качестве ключа кластеризации. Важно выбрать ключ кластеризации, который имеет:
Достаточно большое количество различных значений для эффективного сокращения таблицы.
Достаточно небольшое количество различных значений, чтобы Snowflake мог эффективно группировать строки в одних и тех же микро-разделах.
Столбец с очень низкой мощностью (например, столбец, указывающий только, является ли человек мужчиной или женщиной) может дать только минимальную обрезку. С другой стороны, столбец с очень высокой мощностью (например, столбцы, содержащие значения UUID или наносекундных временных меток) также обычно не является хорошим кандидатом для прямого использования в качестве ключа кластеризации.
Совет
Как правило, если столбец (или выражение) имеет более высокую мощность, то поддержка кластеризации этого столбца обходится дороже.
Стоимость кластеризации по уникальному ключу может быть больше, чем выгода от кластеризации по этому ключу, особенно если точечный поиск не является основным вариантом использования этой таблицы.
Если пользователь хочет использовать столбец с очень высокой мощностью в качестве ключа кластеризации, Snowflake рекомендует определять ключ как выражение в столбце, а не непосредственно в столбце, чтобы уменьшить количество различных значений. Выражение должно сохранять исходный порядок столбцов, чтобы минимальные и максимальные значения в каждом разделе по-прежнему позволяли отсечение.
Например, если в таблице фактов есть столбец TIMESTAMP, c_timestampсодержащий множество дискретных значений (намного больше, чем количество микро-разделов в таблице), то ключ кластеризации может быть определен для столбца путем преобразования значений в даты вместо меток времени (например, to_date(c_timestamp)). Это уменьшит количество элементов до общего количества дней, что обычно дает гораздо лучшие результаты обрезки.
В качестве другого примера вы можете усечь число до меньшего количества значащих цифр, используя TRUNCфункции и отрицательное значение для шкалы, например, TRUNC (123456789, -5)
Если вы определяете ключ кластеризации с несколькими столбцами для таблицы, важен порядок, в котором столбцы указываются в предложении. Как правило, Snowflake рекомендует упорядочивать столбцы от наименьшего к наибольшему числу элементов. Помещение столбца с более высокой мощностью перед столбцом с меньшей мощностью обычно снижает эффективность кластеризации в последнем столбце. CLUSTER BY
В некоторых случаях может быть полезна кластеризация по столбцам, используемым в предложениях или . Однако кластеризация по этим столбцам обычно менее полезна, чем кластеризация по столбцам, которые активно используются в фильтрах или операциях. Если у вас есть несколько столбцов, которые активно используются в операциях фильтрации / объединения, и разные столбцы, которые используются в операциях или, то отдавайте предпочтение столбцам, используемым в операциях фильтрации и объединения.
GROUP BYORDER BYJOINORDER BYGROUP BY
Рекластеринг
Поскольку операции DML выполняются в кластеризованной таблице, данные в
таблице могут стать менее кластеризованными. Для поддержания оптимальной кластеризации требуется периодическая / регулярная перекластеризация таблицы.
Во время повторной кластеризации Snowflake использует ключ кластеризации для кластеризованной таблицы, чтобы реорганизовать данные столбца, чтобы связанные записи перемещались в один и тот же микрораздел. Эта операция DML удаляет затронутые записи и повторно вставляет их, сгруппированные в соответствии с ключом кластеризации.
Однако для некоторых учетных записей ручная повторная кластеризация устарела, но по-прежнему разрешена. Для получения дополнительной информации см. Ручная повторная кластеризация.
Влияние повторной кластеризации на кредит и хранение
Подобно всем операциям DML в Snowflake, перекластеризация требует кредитов. Количество использованных кредитов зависит от размера таблицы и количества данных, которые необходимо повторно кластеризовать.
Рекластеризация также приводит к расходам на хранение. Каждый раз при повторной кластеризации данных строки физически группируются на основе ключа кластеризации для таблицы, в результате чего Snowflake генерирует новые микро-разделы для таблицы. Добавление даже небольшого количества строк в таблицу может привести к воссозданию всех микро-разделов, содержащих эти значения.
Этот процесс может привести к значительному обороту данных, поскольку исходные микро-разделы помечаются как удаленные, но сохраняются в системе, чтобы обеспечить возможность путешествий во времени и отказоустойчивости. Исходные микро-разделы очищаются только после истечения периода хранения Time Travel и последующего периода отказоустойчивости (т. Е. Минимум 8 дней и до 97 дней для расширенного Time Travel, если вы используете Snowflake Enterprise Edition (или выше). Обычно это приводит к увеличению затрат на хранение. Для получения дополнительной информации см. Snowflake Time Travel & Fail-safe.
Важно
Прежде чем определять ключ кластеризации для таблицы, вы должны рассмотреть связанные с этим кредитные затраты и затраты на хранение.
Пример повторной кластеризации
Основываясь на диаграмме кластеризации из предыдущего раздела, эта диаграмма иллюстрирует, как повторная кластеризация таблицы может помочь уменьшить сканирование микро-разделов для повышения производительности запросов: