如何捕获插入到包含标识列的 Redshift 表中的行数?

Posted

技术标签:

【中文标题】如何捕获插入到包含标识列的 Redshift 表中的行数?【英文标题】:How can I capture the number of rows inserted into a Redshift table which contains an identity column? 【发布时间】:2016-10-31 13:28:06 【问题描述】:

在 Amazon Redshift 中,我使用以下查询来捕获最后一个查询插入的行数:

SELECT SUM(rows) FROM stl_insert WHERE query = pg_last_query_id();

当我插入包含 IDENTITY 列的表时,这种方法似乎不起作用,因为 Redshift 也运行此查询:SELECT * FROM stv_identity_highwater 并将此查询的 id 用于 pg_last_query_id()。

是否有其他方法可以捕获在这种情况下插入的行数?

【问题讨论】:

【参考方案1】:

对于在具有标识列的表中插入值,Redshift 会在内部触发查询为 SELECT * FROM stv_identity_highwater,因此计数结果为 0

添加pg_last_query_id()-1获取插入计数:

SELECT SUM(rows) FROM stl_insert WHERE query = pg_last_query_id()-1;

【讨论】:

您好,能否请您在代码块中格式化 sql 查询?这使阅读更加愉快。【参考方案2】:

您可以使用STL_QUERY 系统表来提取您要计算的查询的 ID。

如果您是系统的唯一用户,您可以假设您是倒数第二个查询。

【讨论】:

您可以找到与您的用户 ID 匹配的最新 STL_QUERY 条目。【参考方案3】:

不幸的是,这不起作用:

SELECT SUM(rows) FROM stl_insert WHERE query = pg_last_query_id()-1;

因为 query_id 在 Redshift 中不是连续的。

单个表的检索方式是:

      WITH last_queryid_for_table AS (

           SELECT query, MAX(si.starttime) OVER () as last_q_stime, si.starttime as stime  FROM stl_insert si,
           SVV_TABLE_INFO sti WHERE sti.table_id=si.tbl AND sti."table"='$your_table_name' 
)

           SELECT SUM(rows) FROM stl_insert si, last_queryid_for_table lqt 
           WHERE si.query=lqt.query AND lqt.last_q_stime=stime
当然你应该考虑查询是否失败。如果最后一个结果失败,上述查询将为您提供最新的执行统计信息。

【讨论】:

以上是关于如何捕获插入到包含标识列的 Redshift 表中的行数?的主要内容,如果未能解决你的问题,请参考以下文章

在具有标识列的表中插入 select from

如何在 Redshift 中打开/关闭 IDENTITY_INSERT

如何将 CSV 导出复制到添加了新列的 Redshift 表中?

在 Redshift 中插入列的子字符串

RedShift - 如何通过复合主键过滤表中的记录?

如何找出 Redshift 表中每一列的大小?