#snowflake-cloud-data-platform
#snowflake-cloud-data-platform
Вопрос:
Есть ли способ узнать размер ответа на запрос в Snowflake?
Например, в BigQuery мы получаем размер из временной таблицы, созданной BigQuery в задании запроса.
Спасибо!
Комментарии:
1. Почему бы не использовать таблицу переходных процессов? Из интереса, почему вы хотите знать эту информацию?
2. Да, таблица переходных процессов позволит нам хранить данные дольше, но проблема в том, что они не удаляются автоматически через некоторое время, верно? Нам это нужно для конкретного варианта использования: наиболее важным требованием для этого является то, что ответ отправляется в приложение браузера, и мы хотим ограничить ответ чем-то вроде 100 МБ на запрос, например
3. Хорошо — но в этом случае никакая информация о размере в Snowflake вам не поможет. Данные в Snowflake сильно сжаты (и информация о размере предназначена для этих сжатых данных) — если вы отправите эти данные в веб-приложение, они, очевидно, будут де-сжаты
Ответ №1:
После выполнения запроса вы всегда можете вернуться к его кэшированным результатам. Все, что вам нужно знать, это идентификатор запроса и сканирование его результатов. Затем вы можете определить размер этих результатов любым методом, который вы выберете для измерения размера — например, длиной json, кодирующей все столбцы.
В коде:
-- run a query then get its id
set last_query_id = (select last_query_id());
select sum(length(to_json(object_construct(a.*)))) table_encoded_size
from table(result_scan($last_query_id)) a;
Комментарии:
1. Я рад, что это сработало @oleurud. Пожалуйста, отметьте этот ответ как принятый в качестве признака того, что он сработал для вас 🙂
2. Привет, Фелипе, мне пришлось добавить
object_construct
функцию в цепочку, чтобы заставить ее работать: это было бы:select sum(length(to_json(object_construct(a.*)))) table_encoded_size from table(result_scan($last_query_id)) a;
3. Спасибо, что поделились этим советом @juanra! Запрос работал с данными, которые у меня были, и я рад, что вы нашли хорошее решение, когда этого не произошло
4. Я хочу поделиться нашими окончательными результатами. Используя решение result_scan, когда мы используем таблицу объемом 1,5 ГБ, мы получаем следующие результаты:
SELECT * FROM BIG_TABLE
: 19s (первый раз) или попадание в кэш.result_scan query
: 34 seg (возвращает 1.599.524.104 байт) С использованием временной таблицы:CREATE TEMPORARY TABLE XX AS (SELECT * FROM BIG_TABLE)
: 29 seg иSELECT BYTES FROM WHERE table_name = 'XX'
: 600 мс (2.353.437.184 байт). Как вы видите, есть некоторые различия в требуемом времени и результатах размера. В зависимости от ваших требований к делу, это может быть лучше один или другой5. Некоторые из этих результатов удивительны! С удовольствием углублюсь в электронную почту, если хотите