Amazon web services 红移系统表是不可变的且有序的吗?

Amazon web services 红移系统表是不可变的且有序的吗?,amazon-web-services,amazon-redshift,Amazon Web Services,Amazon Redshift,红移系统表只记录几天的日志数据-定期备份这些表中的行是收集和维护正确历史记录的常见做法。要查找添加到系统日志中的新行,我需要检查备份表中的查询编号或执行时间 根据上的答案,我们可以简单地使用query>selectmaxqueryfromlog选择所有行。答案是未引用的,并假定查询是按顺序插入的 我的问题分为两个部分——希望引用或代码作为证据——是 是否希望按顺序插入查询标识符,以及 系统表(例如stl_查询)是不可变的还是不变的? 假设我们无法验证或证明以上两种情况,那么备份系统表的正确策略是

红移系统表只记录几天的日志数据-定期备份这些表中的行是收集和维护正确历史记录的常见做法。要查找添加到系统日志中的新行,我需要检查备份表中的查询编号或执行时间

根据上的答案,我们可以简单地使用query>selectmaxqueryfromlog选择所有行。答案是未引用的,并假定查询是按顺序插入的

我的问题分为两个部分——希望引用或代码作为证据——是

是否希望按顺序插入查询标识符,以及 系统表(例如stl_查询)是不可变的还是不变的? 假设我们无法验证或证明以上两种情况,那么备份系统表的正确策略是什么

我对此持谨慎态度,因为我完全希望长时间运行的查询能够在许多其他查询启动和完成之后完成

我知道查询标识符是在查询提交时生成的,因为我可以监视正在进行的查询。因此,在query=2之后,长时间运行的query=1可能会完成。如果stl_查询表是不可变的,那么将在query=2之后插入query=1,并且maxquery逻辑存在缺陷

或者,如果在运行时将query=1插入stl_查询,则必须在完成时使用结束时间、持续时间等更新行。这将需要我向备份表中进行upsert。

我认为stl_查询表确实是不可变的,似乎只有在查询完成后才会写入

这就是为什么我这么认为。首先,我在一个集群上运行这个查询,并运行查询

select count(*) from stl_query where endtime is null
这将返回0。我的预感是,你可能会在你这边看到同样的事情

当然,我还运行了以下查询:

select count(*) from stv_inflight i
inner join stl_query q on q.query = i.query
当我在飞行中有查询时,它也返回零,这似乎证实了查询只有在完成执行且未更新时才记录在stl_查询中

也就是说,我将重写查询,将其插入到您的历史记录表中,如下所示:

insert into admin.query_history (
    select * from stl_query
    where query not in (select query from admin.query_history)
)

这样,您将始终插入历史记录表中没有的任何记录。

谢谢Michael。我担心不在,因为这些表最终会变大,但我想这是过度优化了。但现在我使用where endtime>maxendtime来处理那些有endtime列的表。如果您担心性能,我建议在查询时创建一个distkey,在endtime时创建一个sortkey。这样的话,我怀疑如果您在endtime>maxendtime上进行筛选,而查询不在…,那么查询的性能仍然很好。