У меня есть процедура объединения и усечения таблицы на основе определенных ключей. Процедура выглядит нормально, но, похоже, проблема с производительностью
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
Но вышеприведенный запрос выполнен, но не слился, как ожидалось
#Ожидал:
Любое решение или рекомендация по улучшению запроса?
Привет @KoushikRoy да, это требование, предложенное бизнесом ... однако было бы признательно, если бы вы могли предложить лучшее решение?
Мое предложение: 1. посмотрите, что должен делать этот процесс? 2. Реализуйте это на простом SQL. Если вы не можете, вы можете опубликовать логику здесь, и мы можем помочь. Но, глядя на вашу процедуру, я не думаю, что она сложная и похожа на delete from target where key in (select key from src). И основная проблема с вашим процессом заключается в том, что если вам нужно удалить 1000 строк, ваш процесс займет целую вечность.
Привет @KoushikRoy, я обновил вопрос с ожидаемыми вариантами использования. ЕСЛИ достаточно простой процедуры sql, то помогите с логикой. Мы выбрали сноупарк, так как он позволяет динамически усекать строки массива ключей, которые передаются процедуре.





Я думаю, что есть два способа решить эту проблему.
Вариант 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 - как динамически передавать ключи в оператор -
так же, как вы сейчас проходите CREATE OR REPLACE PROCEDURE table_merge(keys Array)
Вам действительно нужна процедура py? разве это не просто как
delete from target where key in (select key from src)или может бытьkey in (1,2,3...)? Почему бы не запустить этот процесс напрямую?