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);