Мы делаем то же самое.Чтобы повысить производительность, попробуйте разделить таблицу на date_purchased
и кластеризовать на orderid
.Используйте оператор CTAS (к самой таблице), так как вы не можете добавить раздел после факта.
РЕДАКТИРОВАТЬ: используйте 2 таблицы и MERGE
В зависимости от вашего конкретного случая использования, т.е.количество полей, которые могут быть обновлены между старым и новым, вы можете использовать 2 таблицы, например, stage_table_orders
для импортированных записей и final_table_orders
в качестве таблицы назначения и сделать MERGE
примерно так:
MERGE final_table_orders F
USING stage_table_orders S
ON F.orderid = S.orderid AND
F.date_purchased = S.date_purchased
WHEN MATCHED THEN
UPDATE SET field_that_change = S.field_that_change
WHEN NOT MATCHED THEN
INSERT (field1, field2, ...) VALUES(S.field1, S.field2, ...)
Pro : эффективен, если несколько строк «вставлены», а не миллионы (хотя и не проверены) + обрезка разделов должна работать.
Con : вы должны явно перечислить поля в предложениях update и insert.Единовременное усилие, если схема в значительной степени исправлена.
Возможны способы дедупликации, и не существует единого размера, подходящего всем.Поищите в SO похожие запросы, используя ARRAY_AGG
или EXISTS
с DELETE
или UNION ALL
, ... Попробуйте их и посмотрите, какие из них лучше подходят для ВАШЕГО набора данных.