Размер кэша результатов в снежинке

#snowflake-cloud-data-platform

Вопрос:

Кэш результатов в Snowflake весьма полезен.

Один из вариантов использования, который я пытаюсь использовать, — это запустить запрос пользователя после пакетной загрузки в хранилище данных, чтобы результат был кэширован. И когда через 2-3 часа, когда бизнес-пользователи выполнят один и тот же запрос, возможно, используя самое маленькое хранилище, данные будут возвращены из кэша.

Но мне нужно понять, каков объем кэша результатов. Можем ли мы как-нибудь узнать, сколько строк может хранить кэш результатов.

Предположим, что пользовательский запрос извлекает миллион строк. Будет ли снежинка хранить все миллионы строк в кэше результатов. Или, скажем, 100 миллионов строк.

Как только емкость будет нарушена, где будут храниться данные. И как мы узнаем о способности и когда она была нарушена

Ответ №1:

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

Каждый раз, когда сохраненный результат запроса используется повторно, Snowflake сбрасывает 24-часовой срок хранения результата, максимум до 31 дня с даты и времени первого выполнения запроса. По истечении 31 дня результат удаляется, и при следующей отправке запроса создается и сохраняется новый результат.

https://docs.snowflake.com/en/user-guide/querying-persisted-results.html

Некоторые дополнительные соображения:

  1. Выполнение одного и того же запроса не гарантирует использование кэша набора результатов. Существует 8 критериев, которым необходимо соответствовать, и даже в этом случае не гарантируется использование кэша набора результатов. https://docs.snowflake.com/en/user-guide/querying-persisted-results.html#retrieval-optimization
  2. Чтобы гарантировать использование кэша набора результатов, вместо выполнения одного и того же запроса в течение 24 часов, вы можете запустить select * from table(result_scan('019caf93-0500...'));
  3. Если вы не выполняете никакой обработки/фильтрации результирующего набора и просто выполняете выбор *, ему даже не нужен работающий склад.
  4. Обратите внимание, что если вы выполните запрос, как в пункте 2, если данные в базовой таблице(таблицах) изменятся, это не изменит результаты. Повторное выполнение исходного оператора, сгенерировавшего результирующий набор, приведет к этому (изменение таблицы является одним из 8 критериев в пункте № 1), но вероятность повторного использования результатов будет меньше.
  5. Если вы используете функцию result_scan, вы можете рассматривать ее как любую таблицу и объединять ее с другими таблицами, фильтровать ее, запускать на ней функции и т. Д. Для выполнения чего-либо, кроме простого выбора без фильтра, потребуется работающий склад. Размер хранилища может быть существенно меньше, чем тот, который использовался для создания результирующего набора в первую очередь. Например, сложный запрос может переварить результаты, а затем кто-то может использовать набор результатов с помощью функции result_scan для фильтрации по строкам или выполнить более простой запрос по предварительно обработанному результату основного запроса.

Комментарии:

1. Спасибо, Грег. Таким образом, вы говорите, что если мой запрос вернет 1 миллиард строк или миллионы, он останется в кэше результатов. Я думал, что будут какие-либо ограничения, поскольку кэш результатов должен быть отдельным вычислением, хранящим данные в памяти

2. Это не хранится в памяти. Он хранится в хранилище объектов (S3, большой двоичный объект Azure, хранилище Google в зависимости от облачной платформы).