指定欄位清單但不使用 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. 從臨時資料表插入其餘的資料列。在您於步驟二用於 UPDATE 陳述式的 VALUES 子句中使用相同的資料欄清單。

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

    drop table stage;