Узнайте, как оптимально вставить несколько строк в таблицу.

Snowflake берет верх над хранилищем данных с безумным количеством блестящих предложений и функций по невероятно низкой цене.

Snowflake помогает организациям двумя способами:

  1. Включение и развитие инноваций.
  2. Подавление технического долга и сложностей.

У Snowflake есть изысканные функции, которые поддаются и привлекают внимание, с другой стороны, документация — это дискуссия в другое время.

Хранимые процедуры хорошо известны в мире SQL и являются одной из многих функций, которые предлагает Snowflake. Хранимые процедуры в Snowflake можно разрабатывать с помощью множества языков программирования.

В этом посте мы рассмотрим, как использовать сценарий снежинки для оптимальной записи миллиона измененных строк в новую таблицу.

Функция языка, называемая снежинкой, позволяет создавать общие сценарии и хранимые процедуры на простом SQL.

Настройка необходимых заполнителей:

  1. Создание таблиц

Давайте создадим две таблицы-образца, поскольку таблицы базы данных служат основой для всех операций 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.

Я надеюсь, что этот пост облегчит обязанности разработчиков и упростит препятствия.

Приятного обучения…..😀😀

Следуйте за мной, чтобы узнать больше:

https://www.linkedin.com/in/jayachandra-sekhar-reddy/

https://twitter.com/ReddyJaySekhar