Teradata - 如何在不锁定编写器的情况下 select? (锁定行访问与锁定 TABLE 访问)
Teradata - how to select without locking writers? (LOCKING ROW FOR ACCESS vs. LOCKING TABLE FOR ACCESS)
我正在开发一个从 Teradata DWH 获取一些数据的应用程序。 DWH 开发人员告诉我在所有 SELECT
查询之前使用 LOCK ROW FOR ACCESS
以避免延迟写入 table(s).
非常熟悉 MS SQL 服务器的 WITH(NOLOCK)
提示,我将 LOCK ROW FOR ACCESS
视为其等效项。但是,INSERT
或 UPDATE
语句不允许使用 LOCK ROW FOR ACCESS
(我不清楚为什么会失败,因为它应该适用于语句选择的 table(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
语句中选择时,我应该使用什么提示来最小化写入延迟?
您不能在 INSERT-SELECT 语句中使用 LOCK ROW FOR ACCESS
。 INSERT 语句将在它正在写入的 table 上放置一个 WRITE 锁,并在它正在选择的 table 上放置一个 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;
不是直接的答案,但我一直认为这是您的 users/applications/etc 应该通过视图访问数据的原因之一。视图锁定 for access
,这不会阻止 inserts/updates。从 table 中选择使用读锁,这将阻止 inserts/updates.
缺点是访问锁,存在脏读的可能性。
按以下方式更改您的查询,您应该没问题。
LOCKING TABLE PersistentTable FOR ACCESS
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;
我正在开发一个从 Teradata DWH 获取一些数据的应用程序。 DWH 开发人员告诉我在所有 SELECT
查询之前使用 LOCK ROW FOR ACCESS
以避免延迟写入 table(s).
非常熟悉 MS SQL 服务器的 WITH(NOLOCK)
提示,我将 LOCK ROW FOR ACCESS
视为其等效项。但是,INSERT
或 UPDATE
语句不允许使用 LOCK ROW FOR ACCESS
(我不清楚为什么会失败,因为它应该适用于语句选择的 table(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
语句中选择时,我应该使用什么提示来最小化写入延迟?
您不能在 INSERT-SELECT 语句中使用 LOCK ROW FOR ACCESS
。 INSERT 语句将在它正在写入的 table 上放置一个 WRITE 锁,并在它正在选择的 table 上放置一个 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;
不是直接的答案,但我一直认为这是您的 users/applications/etc 应该通过视图访问数据的原因之一。视图锁定 for access
,这不会阻止 inserts/updates。从 table 中选择使用读锁,这将阻止 inserts/updates.
缺点是访问锁,存在脏读的可能性。
按以下方式更改您的查询,您应该没问题。
LOCKING TABLE PersistentTable FOR ACCESS
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;