- 类别:
CHANGES¶
CHANGES 子句允许在指定的时间间隔内查询表或视图的变更跟踪元数据,而无需创建具有显式事务偏移的流。多个查询可检索不同事务开始点和结束点之间的变更跟踪元数据。
备注
必须在源表或源视图及其基础表上启用变更跟踪。有关详细信息,请参阅使用说明(本主题内容)。
在查询中,在 FROM 子句中指定了 CHANGES 子句。
可选 END 关键字指定更改间隔的结束时间。结果包括结束标记。
语法¶
参数¶
INFORMATION => { DEFAULT | APPEND_ONLY }根据每个语法中记录的元数据,指定要返回的变更跟踪数据的类型:
DEFAULT返回源对象的所有 DML 变更,包括插入、更新和删除(包括表截断)。这种类型的变更跟踪会比较变更集中已插入和删除的行,以提供行级别增量。例如,最终效果是,在表中的两个事务时间点之间插入且随后删除的行将在增量中移除(即在查询结果中不会返回此类行)。
APPEND_ONLY仅返回追加的行;因此,不执行联接。因此,对于提取、加载、转换 (ELT) 以及完全依赖于行插入的类似情景,查询仅追加变更的性能可能比查询标准(默认)变更的性能高得多。
TIMESTAMP => timestamp指定要用于 Time Travel 的确切日期和时间。请注意,该值必须显式转换为 TIMESTAMP。
OFFSET => time_difference指定自当前时间开始的、要用于 Time Travel 的时间差值(以秒为单位),其格式为
-N,其中N可以是整数或算术表达式(例如,-120为 120 秒、-30*60为 1800 秒或 30 分钟)。STATEMENT => id指定要用作 Time Travel 参考点的语句的查询 ID。此参数支持以下某一类型的任意语句:
DML(例如 INSERT、UPDATE、DELETE)
TCL(BEGIN、COMMIT 事务)
SELECT
STREAM => 'name'指定已查询的表或视图上现有流的标识符(即名称)。流中的当前偏移用作返回源对象的变更数据的
AT时间点。
使用说明¶
查询 CHANGES目录表 :emph:`` 或 外部表 的变更(使用变更跟踪元数据解析)时,:doc:`不</user-guide/tables-external-intro> 支持 ` 子句。
目前,在记录表的变更跟踪元数据之前,必须 至少满足以下条件之一 :
在 CHANGES 查询的时间间隔的表或视图中启用变更跟踪。
为表创建流。
变更跟踪可以通过使用 ALTER TABLE 命令显式启用,也可以在创建流或表时隐式启用。
这两个选项都会向存储变更跟踪元数据的表中添加隐藏列。这些列会占用少量存储空间。
要查询视图的变更数据,必须在源视图及其基础表上启用变更跟踪。有关说明,请参阅 Enabling change tracking on views and underlying tables。此外,该视图受到与视图流相同的限制。有关更多信息,请参阅 Streams on views。
AT | BEFORE 子句是必需的,用于设置变更跟踪元数据的当前偏移量。
可选 END 子句可设置变更间隔的结束时间戳。如果未指定任何 END 值,则使用当前时间戳作为变更间隔的结束。
请注意, END 子句仅在与 CHANGES 子句结合使用以查询变更跟踪元数据时才有效(即,当使用 Time Travel 查询其他对象的历史数据时,此子句不能与 AT|BEFORE 结合使用)。
TIMESTAMP 或 OFFSET 的值必须是常量表达式。
TIMESTAMP 的最小时间分辨率为毫秒。
如果请求的数据超出了 Time Travel 保留期(默认值为 1 天),则语句将失败。
此外,如果请求的数据在 Time Travel 保留期内,但没有可用的历史数据(例如保留期已延长的情况),则语句将失败。
CHANGES 子句计算指定时间间隔内的变更,而不维护持久 偏移存储。有关更多信息,请参阅 CHANGES clause: Read-only alternative to streams。
示例¶
以下示例查询表的标准(增量)和仅追加变更跟踪元数据。未提供 END() 值,因此当前时间戳用作事务时间间隔中的端点:
以下示例使用从表中删除行之前的事务时间点对表进行的仅追加变更:
以下示例与上一个示例类似。此示例使用源表上流的当前偏移量作为使用源表中的变更数据填充新表的时间起点。由于在源对象上创建了流,因此无需在对象上显式启用变更跟踪: