Узнайте, как оптимально вставить несколько строк в таблицу.
Snowflake берет верх над хранилищем данных с безумным количеством блестящих предложений и функций по невероятно низкой цене.
Snowflake помогает организациям двумя способами:
- Включение и развитие инноваций.
- Подавление технического долга и сложностей.
У Snowflake есть изысканные функции, которые поддаются и привлекают внимание, с другой стороны, документация — это дискуссия в другое время.
Хранимые процедуры хорошо известны в мире SQL и являются одной из многих функций, которые предлагает Snowflake. Хранимые процедуры в Snowflake можно разрабатывать с помощью множества языков программирования.
В этом посте мы рассмотрим, как использовать сценарий снежинки для оптимальной записи миллиона измененных строк в новую таблицу.
Функция языка, называемая снежинкой, позволяет создавать общие сценарии и хранимые процедуры на простом SQL.
Настройка необходимых заполнителей:
- Создание таблиц
Давайте создадим две таблицы-образца, поскольку таблицы базы данных служат основой для всех операций SQL.
create or replace table snowflake_insert_main(col1 varchar, col2 number(30,0), col3 varchar); create or replace table snowflake_insert_transformed(col1 varchar);
Давайте добавим некоторые данные в таблицы теперь, когда они готовы.
insert into snowflake_insert_main(col1) values ('Jay_Test', 5 , 'New_Val' ), ('Medium_Test', 8, 'New_Val1');
Эта вставка является самой простой и популярной стратегией; тем не менее, даже если это просто, это становится сложным, когда задействовано множество вставок. То же самое относится и к вводу данных между таблицами.
insert into snowflake_insert_transformed(col1) select col1 from snowflake_insert_main;
Значения из каждой строки нашей исходной таблицы будут вставлены в один столбец целевой таблицы с помощью этого оператора вставки.
Это запустит запрос на вставку в кластер Snowflake, и он будет ждать завершения операции, прежде чем начать следующую вставку.
При работе с огромными объемами данных этот процесс становится накладным и занимает много времени.
Чтение, преобразование и запись займут целую вечность, когда присутствует множество строк. Чтобы вручную выбрать нужный столбец для изменения и загрузки, в Snowflake есть цикл for.
BEGIN LET res RESULTSET := (select top 2 col1 from snowflake_insert_main); LET cur CURSOR for res; for row_variable IN cur DO LET my_table_value STRING := row_variable."col1"; INSERT INTO snowflake_insert_transformed(col1) VALUES (:my_table_value); end for; END
Этот цикл дает оператору больше контроля, но при работе с миллионами записей это рассуждение становится излишним.
Обоснование этого предполагает сохранение временного держателя данных, его выравнивание и запись в целевую таблицу.
Прежде чем писать, давайте воспользуемся массивом для хранения измененных данных.
DECLARE tmp_array ARRAY default ARRAY_CONSTRUCT(); rs_output RESULTSET; BEGIN LET res RESULTSET := (select top 2 substr(col1, -4) from snowflake_insert_main); LET cur CURSOR for res; for row_variable IN cur DO LET my_table_value STRING := row_variable."col1"; INSERT INTO snowflake_insert_transformed(col1) VALUES (:my_table_value); end for; END
Вышеприведенный отрывок показывает, как мы преобразовали наш набор результатов перед загрузкой и выбрали только последние четыре символа строки.
Этот метод решения проблемы сокращает время загрузки 100 тыс. строк вдвое, с 6000 секунд до примерно 120 секунд.
Последним вариантом будет сведение массива в новую таблицу с использованием нашей конструкции массива, а затем выбор желаемых значений для создания новой таблицы в одном вызове кластера.
Полный код:
CREATE OR REPLACE PROCEDURE multi_insert_prod(my_val number(38,0)) RETURNS varchar LANGUAGE SQL EXECUTE AS CALLER AS ' DECLARE tmp_array ARRAY default ARRAY_CONSTRUCT(); rs_output RESULTSET; BEGIN LET res RESULTSET := (select top 1000000 substr(col1, -4) from snowflake_insert_main); LET cur CURSOR for res; for row_variable IN cur DO let my_table_value STRING := row_variable."col1"; tmp_array := ARRAY_APPEND(:tmp_array, my_table_value); end for; rs_output := (CREATE or REPLACE TABLE my_database.my_schema.snowflake_insert_transformed(col1) AS SELECT VALUE FROM TABLE(FLATTEN(:tmp_array)); RETURN rs_output; END ';
Вывод:
Благодаря тому, что разработчики и инженеры получают больший контроль над хранимыми процедурами, использующими только SQL, скрипты Snowflake, новая функция, добавленная в список последних возможностей Snowflake, быстро набирают популярность.
Этот пост посвящен улучшению мыслительных процессов аналитиков данных и инженеров, предоставляя им замечательные возможности Snowflake, которые позволяют им выполнять массовые загрузки из таблицы в таблицу с максимальной эффективностью, что не предусмотрено по умолчанию в Snowflake.
Я надеюсь, что этот пост облегчит обязанности разработчиков и упростит препятствия.
Приятного обучения…..😀😀
Следуйте за мной, чтобы узнать больше: