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