amazon-web-services - 表错误上的可序列化隔离违规
问题描述
我是红移新手,面临“D”:“表错误时可序列化隔离违规。这发生在数据存档处理时间范围内(午夜负载),并影响同一张表的常规批处理作业数据负载。
我在存档加载过程下面写过。有没有最好的方法来避免我下面的脚本中出现这种错误?
你能帮我吗?提前致谢。
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)'
解决方案
好的,在同时运行常规批处理作业数据的情况下,看起来冲突是在执行 INSERT 的事务和在另一个会话中并行运行的 VACUUM 命令之间(根据 Max 的回答)。
关于数据架构,DELETE 是一个相对昂贵的操作,因此为避免错误,您可以考虑另一种方法:
- 在您的表上创建一个 VIEW
abc_data_365
,其中仅包含最近 365 天的数据。 - 不那么频繁地运行 DELETE(可能每月一次),并在当天的 INSERT 完成后立即执行
然后让您的最终用户从 VIEW 中选择,而不是从基表中选择。
- 最终用户可能会看到几乎没有性能下降(如果您每月运行它,那么最坏的情况是 SELECT 将额外扫描 1/12 的表)
- 您将要求 Redshift 执行昂贵的 DELETE 的频率要低得多
像这样的东西:
CREATE VIEW v_abc_data_365 AS
SELECT * FROM abc_data_365
WHERE abc_ts > DATEADD(DAY, -365, current_date);
推荐阅读
- swift4.2 - 如何修复错误:0x0 的内存读取失败
- javascript - 进入时读取登录凭据中的计时器的可访问性 (ADA) 问题
- java - 需要在多实例环境中缓存一些静态图像
- dataframe - 如何对 pyspark 数据框执行连接操作?
- python - 使用 Django(查询集)计算一年中的天数 - postgres
- javascript - 多个电子邮件的 swiftmailer 电子邮件错误
- android - 获取 SettingsActivity 的 ViewModel (MVVM, Android P)
- windows - 如何在pywinauto中从父窗口跳转到子窗口
- python - 在 Django 中注册表单不会发布请求方法
- java - 无法从类外访问方法