2012-05-17 47 views
0

我想在Vertica數據庫中編寫MERGE語句。 我知道它不能直接使用,插入/更新必須結合 才能獲得理想的效果。Vertica中的MERGE

合併一句話是這樣的:

MERGE INTO table c USING (select b.field1,field2 aeg from table a, table b 
where a.field3='Y' 
and a.field4=b.field4 
group by b.field1) t 
    on (c.field1=t.field1) 
    WHEN MATCHED THEN 
     UPDATE 
     set c.UUS_NAIT=t.field2; 

只想看到MERGE的例子被用作插入/更新。

+0

嗨,你可能可以使用關聯連接來更新你的行。它具有比'MERGE'更好的性能(http://vertica.tips/2014/06/23/merge-vs-correlated-join/)。 – Kermit

回答

4

您確實不想在Vertica中進行更新。插入很好。選擇很好。但我強烈建議遠離任何更新或刪除。

系統針對讀取大量數據和插入大量數據進行了優化。所以,既然你想做一個2的操作,我會建議反對它。

如您所述,您可以將該語句拆分爲插入和更新。

我會建議,不知道你想要做什麼,所以這是隨時更改細節:

1)從外部源到一個臨時表中插入數據。
2)使用您正在考慮的標準,將該表執行並從該表執行INSERT-SELECT到您希望的表中。使用連接或在兩個語句中使用子查詢到要測試的表。
3)截斷登臺表。

這似乎令人費解我猜,但你真的不想做更新的。如果你認爲這很麻煩,請記住引起麻煩的是什麼讓你在SELECT語句中獲益。

2

我喜歡傑夫的答案。這似乎違反直覺,但你會有更好的結果創建一個新的表,其中有你想要的行與修改現有的行。

也就是說,這樣做只有在表格超過特定大小或超過一定數量的UPDATE時才值得。如果你正在談論1mil行的表<,我可能有機會進行更新,然後清除掉邏輯行。

0

需要說明的是,Vertica不太適合單行更新,但大型批量更新更不是問題。我不建議重新創建整個表格,我會研究重新創建分區表或批量更新表的策略。

3

如果你想要一個MERGE語句的例子,請點擊鏈接。這是指向Vertica文檔的鏈接。請記得清楚地遵循說明。您無法使用WHEN NOT MATCHEDWHEN MATCHED來編寫合併。它必須遵循文檔中用法描述中給出的順序(這是相反的方式)。但是你可以選擇完全省略一個。

我不確定,如果您知道在Vertica中更新或刪除的數據並未真正從表格中刪除,但只是標記爲「已刪除」。這種數據可以通過運行手動刪除:SELECT PURGE_TABLE('schemaName.tableName');

您可能需要超級用戶權限才能在該架構上執行此操作。 關於這個的更多信息可以在這裏閱讀:Vertica Documentation; Purge Data。 來自Vertica網站的示例:Update and Insert Simultaneously using MERGE

我同意在Vertica 6.0版中支持合併。但是,如果Vertica的AHM或時代管理設置設置爲保存大量歷史記錄(已刪除)的數據,則會降低更新速度。更新速度可能會從糟糕到糟糕甚至糟糕。

我通常會做的是擺脫已刪除(舊)數據,在更新表格後對錶格執行清除操作。這有助於保持更新的速度。 在肯定需要運行更新的地方,合併很有用。特別是可能會更新數百萬行的增量日常更新。

獲得您的答案:我不認爲Vertica在合併中支持子查詢。你會得到以下。

ERROR 0: Subquery in MERGE is not supported 

當我也有類似的用例,我使用子查詢創建一個視圖,並使用新創建的視圖作爲源表合併到目標表。這應該讓您在Vertica中繼續使用MERGE操作,並且定期PURGE應該讓您快速保持更新。

事實上,如果在ON子句中使用正確的字段組合,插入或更新期間合併還有助於避免重複的條目,理想情況下應該是主鍵上的連接。

+0

如果登臺表被刪除並重新創建同名,該怎麼辦? Vertica會保留舊錶數據並追加它(這會導致數據增長)? – BlackHat