Можем ли мы использовать exist в SQL-запросе для поиска и удаления записей из таблицы?

#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.html

4. Если оператор 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. До сих пор я не использовал запрос слияния. Не могли бы вы сообщить мне, подходит ли приведенный выше запрос слияния для моего требования?