Вопрос или проблема
У меня есть запрос в Snowflake, который выдает json-вывод в строках. Более 29,000 строк. Я использую этот запрос для создания записей в системе MDM. Однако этот процесс загрузки немного неэффективен и дорогостоящ. Я взял свой окончательный оператор SELECT, который создавал json, и поместил его в CTE. Затем я сделал новый окончательный оператор SELECT.
SELECT ARRAY_AGG(*) as clin_prov
FROM clin_prov
Это перегрузило систему своим размером. Использование LIMIT в CTE на 1000 и даже 5000 давало результаты, создавая большой json-запись, как и ожидалось, и как я хотел. Я хотел бы получить 30 строк массивов с <= 1000 json-записей в окончательном выводе. Есть ли способ это сделать? Могу ли я создать массивы на основе LIMIT и OFFSET и передать их в отдельные строки? Я
Я пробовал с LIMIT и без него в clin_prov cte. Я пытался использовать отдельные ctes на основе LIMIT и OFFSET, а затем UNION ALL. Это тоже перегрузило систему.
Да, вы можете выполнять пакетную обработку. Попробуйте ниже, изменив значение NTILE
для числа партий.
WITH clin_prov AS (
SELECT
...,
NTILE(50) OVER (ORDER BY some_column) AS batch
FROM
...
)
SELECT batch, ARRAY_AGG(your_json_column) AS clin_prov
FROM clin_prov
GROUP BY batch
ORDER BY batch
Ответ или решение
Да, вы можете обрабатывать данные в пакетном режиме в Snowflake, используя функцию NTILE
для разделения объема данных на более мелкие группы, что позволит избежать перегрузки системы из-за больших объемов JSON.
Вот пример, как это можно сделать. Сначала создается временная итоговая таблица (CTE), в которой данные делятся на пакеты, а затем агрегируются в массивы.
WITH clin_prov AS (
SELECT
your_columns,
your_json_column,
NTILE(30) OVER (ORDER BY some_column) AS batch
FROM
your_source_table
)
SELECT
batch,
ARRAY_AGG(your_json_column) AS clin_prov
FROM
clin_prov
GROUP BY
batch
ORDER BY
batch;
В этом примере:
- Замените
your_columns
,your_json_column
, иyour_source_table
на актуальные названия столбцов и таблиц, которые вы используете. NTILE(30)
используется для создания 30 различных пакетов. Это означает, что система будет делить данные на 30 равных частей, каждая из которых будет содержать примерно одинаковое количество записей. Вы можете изменить30
на любое другое значение, если необходимо больше или меньше пакетов.ORDER BY some_column
определяет порядок, в котором данные будут разбиваться на пакеты. Убедитесь, чтоsome_column
— это столбец с уникальными значениями, чтобы обеспечить равномерное распределение.
Таким образом, вы получите результат в виде строк, где каждая строка будет представлять собой массив JSON из your_json_column
с количеством записей, ограниченным в соответствии с заданным количеством пакетов. Такой подход значительно снизит нагрузку на систему и упростит процесс инжекции данных в вашу MDM-систему.