Перейти к основному содержимому

volatility

💡Did you know...
Available from dbt v1.11 or with the dbt "Latest" release track.
functions/<filename>.yml
functions:
- name: <function name>
config:
volatility: deterministic | stable | non-deterministic

Определение

Вы можете опционально использовать настройку volatility для SQL‑ или Python‑UDF, чтобы описать, насколько предсказуемым является результат работы функции, используя значения deterministic, stable или non-deterministic. Хранилища данных используют эту информацию, чтобы определить, можно ли кэшировать результаты, менять порядок выполнения или встраивать вызовы функций. Указание корректного значения volatility помогает предотвратить некорректные результаты в случаях, когда функцию небезопасно кэшировать или переупорядочивать.

Например:

  • Функция, которая возвращает случайное число (random()), должна быть настроена как non-deterministic, поскольку её результат меняется при каждом вызове.
  • Функция, которая возвращает текущую дату (current_date()), является stable: её значение остаётся неизменным в рамках одного выполнения запроса, но может изменяться между запросами. Если бы она была настроена как deterministic, хранилище данных могло бы ошибочно закэшировать значение и повторно использовать его в последующие дни.

По умолчанию dbt не указывает значение volatility. Если вы не задаёте volatility, dbt генерирует оператор CREATE без ключевого слова volatility, и применяется поведение хранилища данных по умолчанию — за исключением Redshift.

В Redshift dbt по умолчанию устанавливает non-deterministic (VOLATILE), если volatility не указана, потому что Redshift требует явного указания volatility, а VOLATILE является самым безопасным предположением.

 Ключевые слова для указания волатильности, зависящие от хранилища данных

Разные хранилища данных поддерживают управление волатильностью с помощью разных ключевых слов и значений по умолчанию:

Warehousedeterministicstablenon-deterministic
SnowflakeIMMUTABLEНе поддерживаетсяVOLATILE (по умолчанию)
RedshiftIMMUTABLESTABLEVOLATILE (по умолчанию)
DatabricksDETERMINISTICНе поддерживаетсяСчитается non-deterministic, если не указано явно
PostgresIMMUTABLESTABLEVOLATILE (по умолчанию)
Loading table...

BigQuery не поддерживает явную установку волатильности. Вместо этого BigQuery определяет волатильность на основе функций и выражений, используемых внутри UDF.

Поддерживаемые типы volatility

В dbt для конфигурации volatility можно использовать следующие значения:

ValueDescriptionExample
deterministicВсегда возвращает один и тот же результат для одинаковых входных данных. Безопасно для агрессивных оптимизаций и кэширования.substr() — Возвращает одну и ту же подстроку при одинаковой строке и параметрах.
stableВозвращает одно и то же значение в рамках одного выполнения запроса, но может изменяться между выполнениями. Поддерживается не всеми хранилищами. Подробнее см. Warehouse-specific volatility keywords.now() — Возвращает текущее время на момент начала запроса; остаётся постоянным в рамках одного запроса, но отличается между запусками.
non-deterministicМожет возвращать разные результаты для одинаковых входных данных. Хранилища не должны кэшировать или переупорядочивать вычисления, предполагая стабильный результат.first() — Может возвращать разные строки в зависимости от плана запроса или порядка данных.
random() — Генерирует случайное число, которое меняется при каждом вызове, даже при одинаковых входных данных.
Loading table...

Пример

В этом примере используется volatility deterministic для функции is_positive_int:

functions/schema.yml
functions:
- name: is_positive_int
description: Check whether a string is a positive integer
config:
volatility: deterministic # Optional: stable | non-deterministic | deterministic
arguments:
- name: a_string
data_type: string
returns:
data_type: boolean

Нашли ошибку?

0
Loading