旧版 SQL 中的表修饰器

通常,BigQuery 会在运行查询时执行全面列扫描。 您可以使用旧版 SQL 中的表修饰器来对部分数据执行经济有效的查询。无论何时读取表(例如复制表、导出表或使用 tabledata.list 列出数据时),您都可以使用表修饰器。

表修饰器支持相对和绝对 <time> 值。相对值用负数表示,绝对值用正数表示。例如,-3600000 表示相对于当前时间的一个小时以前(以毫秒为单位);3600000 表示 1970 年 1 月 1 日之后的一个小时(以毫秒为单位)。

快照修饰器

语法

@<time>
  • 引用 <time>(以毫秒为单位,从 Epoch 起算)时间点的表快照。
  • <time> 必须在最近 7 天范围内,且不得早于表的创建时间,但必须早于表的删除或到期时间。
  • @0 是一种特殊情况,它引用表可以获得的最早的快照。

表删除后的七天内,您可以使用快照修饰器恢复删除的表

示例

如需获取一小时前对应的表快照,请按如下所示操作:

相对值示例

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000]

绝对值示例

  1. 获取一小时前对应的 <time>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 然后,替换以下查询中的 <time>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time]
    

如需使用快照修饰器和 bq 命令行工具恢复删除的表,请执行以下操作:

恢复删除的表示例

首先,确定删除表之前的时间戳(以毫秒为单位,从 Epoch 起算)。然后,将该时间戳的表复制到新表。 新表不得采用已删除表的名称。

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Delete table1
$ bq rm dataset1.table1

# Undelete table
$ bq cp dataset1.table1@1573060348222 dataset1.table1_restore

范围修饰器

语法

@<time1>-<time2>
  • 引用 <time1><time2>(以毫秒为单位,从 Epoch 起算)期间添加的表数据。
  • <time1><time2> 必须在过去 7 天内。
  • <time2> 是可选项,默认值为“now”。

示例

相对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000--1800000]

如需获取最近 10 分钟的数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-600000-]

绝对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

  1. 获取一小时前对应的 <time1>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 获取半小时前对应的 <time2>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -30, 'MINUTE')/1000)
    
  3. 替换以下查询中的 <time1><time2>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time1-time2]