table 错误上的可序列化隔离冲突
Serializable isolation violation on table error
我是 redshift 的新手并面临 'D': 'Serializable isolation violation on table 错误。
这发生在数据归档过程时间范围内(午夜加载)并影响相同 table.
的常规批处理作业数据加载
我在存档加载过程下面写了。有什么最好的方法可以避免我下面的脚本中出现此类错误吗?
你能帮忙吗?提前致谢。
INSERT INTO abc.data_arch
( col1,col2......
)
With cte_365days_older
AS
(
Select * from abc.abc_data_365
WHERE abc_ts < dateadd(day, -365, current_date)
--LIMIT 1
)
SELECT
col1,col2......
FROM cte_365days_older src
WHERE not exists (select 1 from abc.data_arch trgt
where src.abc_hkey = trgt.abc_hkey
)
order by col1,col2
;
DELETE
from abc.abc_data_365
WHERE abc_ts < dateadd(day, -365, current_date);
COMMIT;
VACUUM DELETE ONLY abc.abc_data_365;
COMMIT;
错误:-
'D': 'Serializable isolation violation on table - 342561, transactions forming the cycle are: 2234341, 2034548 (pid:3235)'
OK,同时使用常规批处理作业数据 运行ning,看起来冲突是在执行 INSERT 的事务与 VACUUM 命令 运行ning 之间在另一个会话中并行(根据 Max 的回答)。
关于数据架构,DELETE 是一个相对昂贵的操作,因此为了避免错误,您可以考虑另一种方法:
- 在您的
abc_data_365
table 上创建一个 VIEW,其中仅包含最多
最近 365 天的数据。
- 运行 DELETE 的频率较低(可能每月一次),并在 当天的 INSERT 完成后立即执行
然后让您的最终用户 SELECT 从 VIEW,而不是基础 table。
- 最终用户可能会发现几乎没有性能下降(如果你 运行 每个月那么最坏的情况下 SELECT 将扫描 1/12 的 table 额外)
- 您将要求 Redshift 执行昂贵的 DELETE 操作的频率大大降低
像这样:
CREATE VIEW v_abc_data_365 AS
SELECT * FROM abc_data_365
WHERE abc_ts > DATEADD(DAY, -365, current_date);
我是 redshift 的新手并面临 'D': 'Serializable isolation violation on table 错误。 这发生在数据归档过程时间范围内(午夜加载)并影响相同 table.
的常规批处理作业数据加载我在存档加载过程下面写了。有什么最好的方法可以避免我下面的脚本中出现此类错误吗?
你能帮忙吗?提前致谢。
INSERT INTO abc.data_arch
( col1,col2......
)
With cte_365days_older
AS
(
Select * from abc.abc_data_365
WHERE abc_ts < dateadd(day, -365, current_date)
--LIMIT 1
)
SELECT
col1,col2......
FROM cte_365days_older src
WHERE not exists (select 1 from abc.data_arch trgt
where src.abc_hkey = trgt.abc_hkey
)
order by col1,col2
;
DELETE
from abc.abc_data_365
WHERE abc_ts < dateadd(day, -365, current_date);
COMMIT;
VACUUM DELETE ONLY abc.abc_data_365;
COMMIT;
错误:-
'D': 'Serializable isolation violation on table - 342561, transactions forming the cycle are: 2234341, 2034548 (pid:3235)'
OK,同时使用常规批处理作业数据 运行ning,看起来冲突是在执行 INSERT 的事务与 VACUUM 命令 运行ning 之间在另一个会话中并行(根据 Max 的回答)。
关于数据架构,DELETE 是一个相对昂贵的操作,因此为了避免错误,您可以考虑另一种方法:
- 在您的
abc_data_365
table 上创建一个 VIEW,其中仅包含最多 最近 365 天的数据。 - 运行 DELETE 的频率较低(可能每月一次),并在 当天的 INSERT 完成后立即执行
然后让您的最终用户 SELECT 从 VIEW,而不是基础 table。
- 最终用户可能会发现几乎没有性能下降(如果你 运行 每个月那么最坏的情况下 SELECT 将扫描 1/12 的 table 额外)
- 您将要求 Redshift 执行昂贵的 DELETE 操作的频率大大降低
像这样:
CREATE VIEW v_abc_data_365 AS
SELECT * FROM abc_data_365
WHERE abc_ts > DATEADD(DAY, -365, current_date);