#sql #snowflake-cloud-data-platform
#sql #snowflake-cloud-data-platform
Вопрос:
Я использую таблицу snowflake, в которой нет механизма разделения, вместо этого у нее есть микроразделы. У нас есть новое требование для выполнения другого типа полной загрузки таблицы.
Сценарий: у меня есть таблица с тремя столбцами: ID, Name, записи Current_Location в День1:
Se Name Current_Location Rate
1 A L1 100
2 B L2 200
3 C L3 300
4 D L4 400
5 E L5 500
6 F L6 600
7 G L7 700
8 H L7 800
Мое требование заключается в том, чтобы я получал новые данные каждый день для каждого Current_Location с разной скоростью, т.е. Day2:
Se Name Current_Location Rate
6 P L6 6000
7 G L7 7000
8 H L7 1100
9 Z L7 1200
Основываясь на значении в столбце: Current_Location, я должен сначала удалить предыдущие записи, а затем загрузить новые записи. Например, с Current_Location L7 В приведенном выше сценарии для L7 в День1 есть две записи, а в День2 я получаю три записи. Поэтому я должен удалить
7 G L7 700
8 H L7 800
а затем загрузите все три новые записи из Day2 в мою таблицу. То же самое касается L6. Итоговая таблица после удаления и загрузки должна выглядеть следующим образом:
Se Name Current_Location Rate
1 A L1 100
2 B L2 200
3 C L3 300
4 D L4 400
5 E L5 500
6 P L6 6000
7 G L7 7000
8 H L7 1100
9 Z L7 1200
Для достижения этой цели я реализовал:
select *
from maintable
where exists (select 1
from stagingtable
where maintable.keycolumn = stagingtable.keycolumn)
Этот запрос приводит к данным, которые я хочу.
delete from maintable
where exists select 1
from stagingtable
where maintable.keycolumn = stagingtable.keycolumn
Я преобразовал его в delete
запрос, чтобы я мог удалять записи с помощью этого запроса, а затем запускать
insert into maintable (select * from stagingtable)
Есть ли лучший подход, чем использование
delete from maintable
where exists select 1
from stagingtable
where maintable.keycolumn = stagingtable.keycolumn
Кто-нибудь может сообщить мне, как я могу настроить / настроить запрос, если это может повысить производительность запроса?
Любая помощь приветствуется.
Комментарии:
1. Вы путаете терминологию УСЕЧЕНИЕ очищает всю таблицу УДАЛЕНИЕ удаляет строки
2. @P.Salmon Это была ошибка. Я должен был использовать DELETE в первую очередь вместо TRUNCATE. Я изменил это сейчас.
3. Вы могли бы использовать
merge
оператор для объединения двух операторов в один. Хотя это не обязательно ускорит ваш запрос, оно упрощает его. Документация по запросу слияния: docs.snowflake.com/en/sql-reference/sql/merge.html4. Если оператор merge не ускоряет запрос, могу ли я реализовать его каким-либо другим способом?
5. Вы могли бы включить автоматическую кластеризацию в таблице с
Current_Location
полем в качестве ключа кластера. Это должно ускорить удаление, но это связано с затратами.
Ответ №1:
вы можете использовать merge
merge into maintable using (
select keycolumn, v
from stagingtable
) as b on maintable.keycolumn = b.keycolumn
when matched then update set maintable.v = b.v
when not matched then insert (keycolumn, v) values (b.keycolumn, b.v);
Комментарии:
1. Вот сценарий, если у меня есть 3 записи в день1, а в день2 я получил только 1 запись, я должен удалить 3 записи дня1 и просто вставить эту одну новую запись из дня2. Таким образом, конечными данными в таблице будет только одна запись из day2. До сих пор я не использовал запрос слияния. Не могли бы вы сообщить мне, подходит ли приведенный выше запрос слияния для моего требования?