AS OF SYSTEM TIME timestamp子句使得语句能使用“as of”指定过去时间内的数据库内容执行。

此子句可用于读取历史数据(也称为“time travel queries”),并且有利于性能,因为它可以减少事务冲突。 有关更多详细信息,请参阅SQL性能最佳实践

历史数据仅在垃圾收集窗口中可用,该窗口由复制区域配置中的ttlseconds字段确定。

概要

在多个SQL上下文支持AS OF SYSTEM TIME子句,包括但不限于:

目前,CockroachDB在显式事务中不支持AS OF SYSTEM TIME,将来可能会取消此限制。

参数

timestamp参数支持以下格式:

Format Notes
INT 自Unix时代以来的纳秒。
STRING TIMESTAMPINT数量的纳秒。

示例

选择历史数据 (Time-Travel)

假设这个例子代表了数据库的当前数据:

> SELECT name, balance
    FROM accounts
   WHERE name = 'Edna Barath';
+-------------+---------+
|    name     | balance |
+-------------+---------+
| Edna Barath |     750 |
| Edna Barath |    2200 |
+-------------+---------+

我们可以使用UTC时间2016年10月3日12:45 进行查询数据:

> SELECT name, balance
    FROM accounts
         AS OF SYSTEM TIME '2016-10-03 12:45:00'
   WHERE name = 'Edna Barath';
+-------------+---------+
|    name     | balance |
+-------------+---------+
| Edna Barath |     450 |
| Edna Barath |    2000 |
+-------------+---------+

使用不同的时间戳格式

假设以下语句在2016-01-01 12:00:00运行,它们将从2016-01-01 08:00:00开始执行:

> SELECT * FROM t AS OF SYSTEM TIME '2016-01-01 08:00:00'
> SELECT * FROM t AS OF SYSTEM TIME 1451635200000000000
> SELECT * FROM t AS OF SYSTEM TIME '1451635200000000000'

多表查询

目前还无法通过不同时间戳查询多个表的数据。 整个查询在指定过去的某个时间运行。

在单个FROM子句中查询多个表时,AS OF SYSTEM TIME子句必须出现在最后并应用于SELECT子句。

:

> SELECT * FROM t, u, v AS OF SYSTEM TIME '2016-01-01 08:00:00';
> SELECT * FROM t JOIN u ON t.x = u.y AS OF SYSTEM TIME '2016-01-01 08:00:00';
> SELECT * FROM (SELECT * FROM t), (SELECT * FROM u) AS OF SYSTEM TIME '2016-01-01 08:00:00';

在子查询中使用 AS OF SYSTEM TIME

要启用time travel,AS OF SYSTEM TIME子句必须至少出现在顶层语句中,仅在子查询中使用它是无效的。

举个例子, 以下是无效的:

SELECT * FROM (SELECT * FROM t AS OF SYSTEM TIME '2016-01-01 08:00:00'), u

为了便于从较简单的查询组成更大的查询,CockroachDB在以下条件下允许子查询中的AS OF SYSTEM TIME

举个例子:

> SELECT * FROM (SELECT * FROM t AS OF SYSTEM TIME '2016-01-01 08:00:00') tp
           JOIN u ON tp.x = u.y
           AS OF SYSTEM TIME '2016-01-01 08:00:00'  -- same timestamp as above - OK.
     WHERE x < 123;

See Also

Tech Note

虽然支持以下格式,但多数用户不打算使用它。

可以使用DECIMAL指定HLC时间戳。 整数部分是以纳秒为单位的时间。小数部分是逻辑计数器,10位整数。 这与cluster_logical_timestamp()函数生成的格式相同。