2017-04-27 32 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,这不会阻止插入/更新。从表中选择使用读取锁,这将防止插入/更新。

缺点是存在访问锁,存在脏读的可能性。