我有一個MLOAD作業,可以將數據從Oracle數據庫插入Teradata數據庫。它所做的一件事就是丟棄目標表並重新創建它。我們的生產網站根據目標表中的內容填充下拉列表。MLOAD是否在單個事務中執行?
如果MLOAD腳本不在單個事務中,那麼如果在MLOAD作業期間發生綁定,則可能無法正確填充下拉列表。但是,如果它是事務性的,它將是一個無縫的過程,因爲只有在事務提交之前,這些更改纔會顯示出來。
我在運行MLOAD作業後檢查了dbc.DBQLogTbl
和dbc.DBQLQryLogsql
視圖,看起來作業中發生了多個事務,所以似乎整個作業不是在單個事務中完成的。但是,我想在做出假設之前確認情況確實如此。
想過了,你說得對,我應該刪除。我最初做到了這一點,並且工作正常,但刪除/重新創建表的邏輯是捕獲源表模式中的任何更改(varchar2長度更改,數據類型更改等)。但是,我發現MLOAD文件無論如何都不得不進行修改,所以這是一個有爭議的問題。那麼你是說插入目標表是事務性的?如果我在'insert into mydb.mytable'之前添加'delete mydb.mytable;',刪除和插入將發生在同一個事務中? – oscilatingcretin
** DELETE mytable; **是在BEGIN/END MLOAD之外提交的(即支持環境命令),因此它是一個單獨的事務。但對於CREATE TABLE來說,完全相同,在創建/刪除表之後以及在MLoad鎖應用於會話可以讀取零行之前的很短時間內。視圖切換不會顯示該行爲。 – dnoeth
你說得對。將刪除放在開始/結束時會打破腳本。我會做的是創建第二個重複表並使用BTEQ腳本刪除這些記錄,然後從事務中的MLOADed表插入。然後我不必使用視圖切換。 – oscilatingcretin