Teradata - 如何在不锁定写入器的情况下进行选择?(锁定行访问与锁定表访问)

Ale*_*xei 1 teradata rowlocking table-locking

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

由于非常熟悉 MS SQL Servers 的WITH(NOLOCK)提示,我认为LOCK ROW FOR ACCESS它是等效的。但是,INSERTorUPDATE语句不允许使用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
Run Code Online (Sandbox Code Playgroud)

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

问题: 在语句中进行选择时,应该使用什么提示来最大程度地减少写入延迟INSERT

JNe*_*ill 5

您不能LOCK ROW FOR ACCESS在 INSERT-SELECT 语句上使用。INSERT 语句将在其写入的表上放置一个写锁,并在其选择的表上放置一个读锁。

如果绝对必须使用LOCK ROW FOR ACCESSINSERT-SELECT,那么请考虑创建一个如下视图:

 CREATE VIEW tmpView_PersistentTable AS
 LOCK ROW FOR ACCESS
 SELECT Cols FROM PersistentTable;
Run Code Online (Sandbox Code Playgroud)

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

 INSERT INTO SomeVolatile
 SELECT Cols FROM tmpView_PersistentTable;
Run Code Online (Sandbox Code Playgroud)