Параллельное выполнение SQL-инструкций внутри хранимой процедуры в SnowFlake DB

#snowflake-cloud-data-platform #snowflake-task

#snowflake-cloud-data-platform #snowflake-задача

Вопрос:

В SnowFlake есть ли какая-либо возможность параллельного выполнения инструкций sql внутри хранимой процедуры. У меня есть хранимая процедура (показана ниже), которая содержит 35 инструкций sql, которые выполняются последовательно. Мы планируем сократить время, думая о параллельном выполнении всего этого.

Каков наилучший подход для достижения этой цели? (Все, о чем я мог подумать, это создать 35 хранимых процедур и вызвать их все из планировщика одновременно). Хотел проверить, будет ли какой-либо лучший подход к какой-либо функции SnowFlake для достижения этой цели?

 create or replace procedure SP_TEST()
  returns string
  language javascript
  execute as CALLER
  as
  $$
    try {
      var step_num = 0
    step_num = 0
    step_num   //--#1
       var sql_statement1   = snowflake.createStatement( {sqlText: `INSERT INTO TGT_TBL select * from TBL_A`} )
       var sql_statement1_execute = sql_statement1.execute() 
        step_num   //--#1
      var sql_statement2   = snowflake.createStatement( {sqlText: `INSERT INTO TGT_TBL select * from TBL_B`} )
      var sql_statement2_execute = sql_statement2.execute() 
      return  "Completed " step_num " steps to load into TGT_TBL"
     }
   catch (err) {
        throw(err)
    }
  $$
;
  

Ответ №1:

На самом деле это последовательно, потому что вы запускаете execute()-метод для каждого оператора.

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

Но в целом: увеличение размера вашего склада — хороший способ сэкономить некоторое время, поскольку запросы могут выполняться быстрее. Это не параллельно, но быстрее.

Масштабирование (т. Е. Использование многокластерного хранилища), на мой взгляд, не дает преимуществ при использовании одной единственной процедуры.

Ответ №2:

В качестве альтернативы вашей идее о создании 35 задач, вы можете рассмотреть возможность создания одной задачи для вызова хранимой процедуры, которая создаст 35 задач для вызова этих отдельных запросов. Если SQLL запроса могут быть прочитаны из таблицы или какая-то их часть может быть сгенерирована JavaScript (например, имена таблиц с датами, т.Е. CONNECT20200120 и т. Д.), То Это может быть хорошей автоматизацией.

Комментарии:

1. Не могли бы вы объяснить подробно. Я понимаю, что могу сохранить запросы в таблице и забрать их оттуда. Но как я могу заставить эти 35 инструкций выполняться непоследовательно?

2. Вам необходимо создать новую задачу для каждого запроса для параллельных запусков. Я вижу здесь только одну проблему: snowflake не поддерживает одноразовые задачи. Таким образом, может быть основная задача и дочерние задачи, определенные с помощью предложения «after», и более чистая задача для удаления всех задач после первого запуска.

Ответ №3:

разделите свой SP на несколько (которые должны выполняться параллельно) и используйте зависимые от SF задачи для выполнения различных частей после завершения основной части.

Ответ №4:

Если ваша цель — заполнить таблицу TGT_TBL значениями из кратных таблиц [TBL_A, TBL_B, …, TBL_35]. Я бы рекомендовал вам использовать сторонний инструмент, такой как dbt, Informatica Cloud (IICS) или любой инструмент, который вы предпочитаете из этого списка https://docs.snowflake.com/en/user-guide/ecosystem-etl.html .

Фактически, хранимые процедуры или даже задачи Snowflake ограничены, а также их сложно отслеживать для полных конвейеров оркестровки / интеграции.

Используя IICS с Pushdown Optimization или dbt, вы можете использовать метод инкрементной загрузки и выполнять все ваши 35 sql-инструкций одновременно на Snowflake, по-прежнему используя возможности виртуальных хранилищ Snowflake.

Комментарии:

1. Еще более простым способом было бы объединить различные запросы select в одну вставку, например: INSERT INTO table SELECT ... UNION ALL SELECT ... UNION ALL SELECT ...; . Но это работает только в том случае, если все вставки попадают в одну и ту же таблицу!