1

我正在开发一个从 Teradata DWH 获取一些数据的应用程序。DWH 开发人员告诉我LOCK ROW FOR ACCESS在所有SELECT查询之前使用以避免延迟对该表的写入。

非常熟悉 MS SQL Servers 的WITH(NOLOCK)提示,我认为LOCK ROW FOR ACCESS它是等价的。但是,INSERTUPDATE语句不允许使用LOCK ROW FOR ACCESS(我不清楚为什么会失败,因为它应该应用于语句选择的表,而不是我插入的表):

-- 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

4

3 回答 3

4

您不能LOCK ROW FOR ACCESS在 INSERT-SELECT 语句上使用。INSERT 语句将在它正在写入的表上放置一个 WRITE 锁,并在它从中选择的表上放置一个 READ 锁。

如果您必须LOCK ROW FOR ACCESS使用 INSERT-SELECT,则考虑创建如下视图:

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

然后从视图中执行您的 INSERT-SELECT:

 INSERT INTO SomeVolatile
 SELECT Cols FROM tmpView_PersistentTable;
于 2017-04-27T17:02:28.017 回答
2

不是一个直接的答案,但我一直认为这是您的用户/应用程序/等应该通过视图访问数据的原因之一。视图 lock for access,它不会阻止插入/更新。从表中选择使用读锁,这将阻止插入/更新。

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

于 2017-04-27T17:52:35.607 回答
0

如下更改您的查询,您应该会很好。

LOCKING TABLE PersistentTable FOR ACCESS 
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;
于 2018-04-12T09:42:59.773 回答