本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
不使用 MERGE命令指定資料欄清單,以執行合併操作
當您執行程序中詳述的合併操作時,請將所有步驟置於單一交易中。如果有任何步驟失敗,您可以復原交易。使用單一交易也會減少認可的數目,如此可節省時間和資源。
指定資料欄清單來執行合併操作
-
將整個操作放在單一交易區塊中。
BEGIN transaction; … END transaction;
-
建立臨時資料表,然後將它填入要合併的資料,如下列虛擬程式碼所示。
create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
-
使用內部聯結搭配臨時資料表來更新目標資料表。
-
在 UPDATE子句中,明確列出要更新的欄。
-
使用臨時資料表來執行內部聯結。
-
如果分佈索引鍵與主索引鍵不同,並且分佈索引鍵將不會更新,請在分佈索引鍵上新增備援聯結。若要驗證查詢將使用已合併聯結,請使用 執行查詢,EXPLAIN並在所有聯結上檢查 DS_DIST_NONE。如需詳細資訊,請參閱 評估查詢計畫
-
如果您的目標資料表是依時間戳記排序,請在目標資料表上新增述詞來利用受範圍限制的掃描。如需詳細資訊,請參閱設計查詢的 Amazon Redshift 最佳實務。
-
如果您將不會在合併中使用所有資料列,請新增子句來篩選要變更的資料列。例如,在一或多個資料欄上新增不相等篩選條件,以排除未變更的資料列。
-
將更新、刪除和插入操作放置在單一交易區塊,如此一來若發生問題,各個項目都將能復原。
例如:
begin transaction; update target set col1 = stage.col1, col2 = stage.col2, col3 = 'expression' from stage where target.primarykey = stage.primarykey and target.distkey = stage.distkey and target.col3 > 'last_update_time' and (target.col1 != stage.col1 or target.col2 != stage.col2 or target.col3 = 'filter_expression');
-
-
使用內部聯結搭配目標資料表從臨時資料表刪除不需要的資料列。目標資料表中的部分資料列已符合臨時資料表中的對應資料列,而其他資料列在先前的步驟中已更新。在任一情況下,插入不需要這些資料。
delete from stage using target where stage.primarykey = target.primarykey;
-
從臨時資料表插入其餘的資料列。在子VALUES句中使用您在步驟 2 的UPDATE陳述式中使用的相同資料欄清單。
insert into target (select col1, col2, 'expression' from stage); end transaction;
-
捨棄臨時資料表。
drop table stage;