不使用 MERGE命令指定資料欄清單,以執行合併操作 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

不使用 MERGE命令指定資料欄清單,以執行合併操作

當您執行程序中詳述的合併操作時,請將所有步驟置於單一交易中。如果有任何步驟失敗,您可以復原交易。使用單一交易也會減少認可的數目,如此可節省時間和資源。

指定資料欄清單來執行合併操作
  1. 將整個操作放在單一交易區塊中。

    BEGIN transaction; … END transaction;
  2. 建立臨時資料表,然後將它填入要合併的資料,如下列虛擬程式碼所示。

    create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
  3. 使用內部聯結搭配臨時資料表來更新目標資料表。

    • 在 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');
  4. 使用內部聯結搭配目標資料表從臨時資料表刪除不需要的資料列。目標資料表中的部分資料列已符合臨時資料表中的對應資料列,而其他資料列在先前的步驟中已更新。在任一情況下,插入不需要這些資料。

    delete from stage using target where stage.primarykey = target.primarykey;
  5. 從臨時資料表插入其餘的資料列。在子VALUES句中使用您在步驟 2 的UPDATE陳述式中使用的相同資料欄清單。

    insert into target (select col1, col2, 'expression' from stage); end transaction;
  6. 捨棄臨時資料表。

    drop table stage;