2017-04-27 104 views
1

我正在開發一個應用程序,從Teradata DWH獲取一些數據。 DWH開發人員告訴我,在所有SELECT查詢之前使用LOCK ROW FOR ACCESS以避免延遲寫入該表。Teradata - 如何選擇不鎖定作家? (鎖定行訪問與鎖定表訪問)

對MS SQL Server的WITH(NOLOCK)提示非常熟悉,我看到LOCK ROW FOR ACCESS等效。然而,INSERTUPDATE聲明不允許使用LOCK ROW FOR ACCESS(目前尚不清楚,我爲什麼失敗,因爲它應該申請表(S)的聲明從選擇,而不是一個我插入):

-- this works 
LOCK ROW FOR ACCESS 
SELECT Cols 
FROM Table 

-- this does not work 
LOCK ROW FOR ACCESS 
INSERT INTO SomeVolatile 
SELECT Cols 
FROM PersistentTable 

我已經看到可以使用LOCKING TABLE ... FOR ACCESS,但不清楚它是否符合我的需要(NOLOCK等效 - 不要屏蔽寫入)。

問題:我應該使用什麼提示,以儘量減少寫入延遲的INSERT語句中進行選擇時?

回答

3

您不能在INSERT-SELECT語句上使用LOCK ROW FOR ACCESS。 INSERT語句會在它正在寫入的表上放置一個WRITE鎖,並在它所選擇的表上放置一個READ鎖。

如果它是絕對必要的,你在INSERT-SELECT得到LOCK ROW FOR ACCESS,則可以考慮創建一個視圖,如:

CREATE VIEW tmpView_PersistentTable AS 
LOCK ROW FOR ACCESS 
SELECT Cols FROM PersistentTable; 

,然後執行你的INSERT,選擇查看:

INSERT INTO SomeVolatile 
SELECT Cols FROM tmpView_PersistentTable; 
+0

使用視圖是一個很好的建議。不幸的是,我不允許執行更改,但我可以要求MDW開發人員將我訪問的表封裝爲「鎖定行以訪問」視圖。 – Alexei

+0

@Alexei:在Teradata環境中,大多數最終用戶只能訪問包括LOCK ROW ACCESS在內的1:1視圖,因此這些視圖可能已經存在。另外,除非使用源表的PI選擇,否則LOCK ROW/TABLE之間沒有區別。 Btw,MDW =來自德國的大零售商? – dnoeth

+0

@dnoeth - 哦,對不起。 MDW =主數據倉庫。我曾在幾家本地公司中看到過它的縮寫,我認爲這是一個已知的縮寫,但你和谷歌證明我錯了。是的,這是關於DE數據倉庫的大零售商。 – Alexei

1

不是一個直接的答案,但我一直認爲這是你的用戶/應用程序/等應該通過視圖訪問數據的原因之一。視圖鎖定for access,這不會阻止插入/更新。從表中選擇使用讀取鎖,這將防止插入/更新。

缺點是存在訪問鎖,存在髒讀的可能性。