我正在开发一个从Teradata DWH中获取一些数据的应用程序。 DWH开发人员告诉我在所有LOCK ROW FOR ACCESS
查询之前使用SELECT
以避免延迟对该表的写入。
非常熟悉MS SQL Server的WITH(NOLOCK)
提示,我将LOCK ROW FOR ACCESS
视为等效。但是,INSERT
或UPDATE
语句不允许使用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
声明中进行选择时,我应该使用哪些提示来最小化写入延迟?
答案 0 :(得分: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-SELECT:
INSERT INTO SomeVolatile
SELECT Cols FROM tmpView_PersistentTable;
答案 1 :(得分:1)
不是直接的答案,但我的理解是,这是您的用户/应用程序/等应通过视图访问数据的原因之一。视图锁定for access
,这不会阻止插入/更新。从表中选择使用读锁定,这将阻止插入/更新。
缺点是访问锁定,存在脏读的可能性。
答案 2 :(得分:0)
如下所示更改您的查询,您应该做得很好。
LOCKING TABLE PersistentTable FOR ACCESS
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;