Как улучшить производительность в сноупарке?

У меня есть процедура объединения и усечения таблицы на основе определенных ключей. Процедура выглядит нормально, но, похоже, проблема с производительностью



CREATE OR REPLACE PROCEDURE table_merge(keys Array)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'reverse_str'
AS
$$
from snowflake.snowpark.functions import when_matached
def table_merge(session,keys):
  df_src= session.table(source_table)
  df_tgt= session.table(target_table)
  key_conditon = None
  for key in deletion_keys:
    if condition = None:
       condition = df_src[key]==df_tgt[key]
    else:
        condition = condition & (df_src[key]==df_tgt[key])
  df_tgt.merge(df_src, condition, [when_matched().delete()])

  return 'Pass'
$$; 

когда я выполнил вышеуказанный запрос, он занял около 28 секунд даже для 3 записей?

Итак, чтобы проверить выполнение, используя обычный запрос снежинки, я попытался выполнить запрос ниже.

merge into  target_table t using (select "ID", "NAME" from source_table) s on s.ID = t.ID and s.NAME = t.NAME when matched then delete

Но вышеприведенный запрос выполнен, но не слился, как ожидалось

#Ожидал:

  1. Объединение данных из источника в цель
  2. При слиянии, если ключи из источника совпадают с целевой таблицей, обрежьте эти строки в целевой таблице, а затем вставьте новые данные из источника в целевую.
  3. Ключи для усечения должны быть динамическими, поэтому оператор запроса должен иметь возможность усекать строки на основе ключей, которые передаются процедуре.

Любое решение или рекомендация по улучшению запроса?

Вам действительно нужна процедура py? разве это не просто как delete from target where key in (select key from src) или может быть key in (1,2,3...) ? Почему бы не запустить этот процесс напрямую?

Koushik Roy 29.05.2023 12:09

Привет @KoushikRoy да, это требование, предложенное бизнесом ... однако было бы признательно, если бы вы могли предложить лучшее решение?

Hari 29.05.2023 12:25

Мое предложение: 1. посмотрите, что должен делать этот процесс? 2. Реализуйте это на простом SQL. Если вы не можете, вы можете опубликовать логику здесь, и мы можем помочь. Но, глядя на вашу процедуру, я не думаю, что она сложная и похожа на delete from target where key in (select key from src). И основная проблема с вашим процессом заключается в том, что если вам нужно удалить 1000 строк, ваш процесс займет целую вечность.

Koushik Roy 29.05.2023 16:06

Привет @KoushikRoy, я обновил вопрос с ожидаемыми вариантами использования. ЕСЛИ достаточно простой процедуры sql, то помогите с логикой. Мы выбрали сноупарк, так как он позволяет динамически усекать строки массива ключей, которые передаются процедуре.

Hari 29.05.2023 16:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что есть два способа решить эту проблему.

Вариант 1. Удалить и вставить — быстрее из-за массовой операции. В вашей процедуре py ваш ввод - это ключи. Так, Сначала удалите на основе ключей -

delete from target_table where keys in (select keys from src_table) and keys in (input_keys)

Во-вторых, вставьте данные из источника -

insert into target_table  select * from src_table where keys in (input_keys)

Вариант 2 - Использование слияния. Это будет медленнее, так как слияние является более медленной операцией.

merge into  target_table t using (select "ID" sid, "NAME" sname from source_table keys in (input_keys)) s on s.ID = t.ID and s.NAME = t.NAME when matched then UPDATE 
set  id=sid, name=sname;

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

хорошо. Спасибо @Koushik .. Итак, для первого варианта 1 - как динамически передавать ключи в оператор -

Hari 30.05.2023 06:49

так же, как вы сейчас проходите CREATE OR REPLACE PROCEDURE table_merge(keys Array)

Koushik Roy 30.05.2023 08:49

Другие вопросы по теме