首页 > 解决方案 > 表错误上的可序列化隔离违规

问题描述

我是红移新手,面临“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)'

标签: amazon-web-servicesamazon-redshift

解决方案


好的,在同时运行常规批处理作业数据的情况下,看起来冲突是在执行 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);

推荐阅读