为 BigQuery 表编入元数据索引

本文档介绍了如何在 BigQuery 中为列元数据编入索引,并说明了如何分配专用资源来提高索引新鲜度和查询性能。

BigQuery 会自动为超过 1 GB 的 BigQuery 表的元数据编入索引。这些元数据包括文件位置、分区信息和列级属性,BigQuery 会使用这些元数据来优化和加速查询。

默认情况下,在 BigQuery 中为元数据编入索引是一项免费的后台操作,您无需执行任何操作。不过,索引新鲜度取决于可用的空闲资源,并且没有性能服务等级目标 (SLO)。如果索引新鲜度对您的应用场景至关重要,我们建议您配置 BACKGROUND 预留

查看元数据索引刷新时间

如需查看表的上次元数据索引刷新时间,请查询 INFORMATION_SCHEMA.TABLE_STORAGE 视图LAST_METADATA_INDEX_REFRESH_TIME 列。为此,请按以下步骤操作:

  1. 在 Trusted Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    SELECT
      project_id,
      project_number,
      table_name,
      last_metadata_index_refresh_time
    FROM
      [PROJECT_ID.]region-REGION.INFORMATION_SCHEMA.TABLE_STORAGE;

    请替换以下内容:

    • PROJECT_ID:您的 Trusted Cloud by S3NS 项目的 ID。 如果未指定,则使用默认项目。
    • REGION:项目所在的区域,例如 region-us
  3. 点击 运行

查看列元数据索引使用情况

如需查看作业完成后是否使用了列元数据索引,请检查作业资源的 TableMetadataCacheUsage 属性。如果 unusedReason 字段为空(未填充),则系统会使用列元数据索引。如果该字段已填充,随附的 explanation 字段会提供未使用列元数据索引的原因。

您还可以使用 INFORMATION_SCHEMA.JOBS 视图中的 metadata_cache_statistics 字段查看列元数据索引使用情况。

例如,以下代码显示了 my-job 作业的列元数据索引使用情况:

SELECT metadata_cache_statistics
FROM `region-US`.INFORMATION_SCHEMA.JOBS
WHERE job_id = 'my-job';

再举一个例子,以下代码显示了使用了 my-table 表的列元数据索引的作业数:

SELECT COUNT(*)
FROM
  `region-US`.INFORMATION_SCHEMA.JOBS,
  UNNEST(metadata_cache_statistics.table_metadata_cache_usage) AS stats
WHERE
  stats.table_reference.table_id='my-table' AND
  stats.table_reference.dataset_id='my-dataset' AND
  stats.table_reference.project_id='my-project' AND
  stats.unusedReason IS NULL;

设置专用索引编入资源

如需在项目中为元数据索引更新设置资源,您首先需要为该项目分配预留。为此,请按以下步骤操作:

  1. 创建 BACKGROND 预留
  2. 将项目分配到预留

设置预留后,请选择以下方法之一为元数据索引编入作业分配槽。默认情况下,如果槽处于空闲状态,您以这种方式分配的槽会与其他作业共享。如需了解详情,请参阅空闲槽

控制台

  1. 在 Trusted Cloud 控制台中,前往容量管理页面。

    转到“容量管理”

  2. 依次点击 预留操作 > 创建分配

  3. 选择您的预留项目。

  4. 作业类型设置为后台

  5. 点击创建

bq

使用 bq mk 命令

bq mk \
  --project_id=ADMIN_PROJECT_ID \
  --location=LOCATION \
  --reservation_assignment \
  --reservation_id=RESERVATION_NAME \
  --assignee_id=PROJECT_ID \
  --job_type=BACKGROUND \
  --assignee_type=PROJECT

请替换以下内容:

  • ADMIN_PROJECT_ID:拥有预留资源的管理项目的项目 ID。
  • LOCATION:预留的位置
  • RESERVATION_NAME:预留的名称。
  • PROJECT_ID:要分配给此预留的项目 ID。

SQL

如需将预留分配给项目,请使用 CREATE ASSIGNMENT DDL 语句

  1. 在 Trusted Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE ASSIGNMENT
    ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME.ASSIGNMENT_ID
    OPTIONS (
      assignee = 'projects/PROJECT_ID',
      job_type = 'BACKGROUND');
    请替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留资源的管理项目的项目 ID。
    • LOCATION:预留的位置
    • RESERVATION_NAME:预留的名称。
    • ASSIGNMENT_ID:分配的 ID。此 ID 对项目和位置来说必须是唯一的,以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。
    • PROJECT_ID:包含表的项目 ID。此项目已分配到预留。
  3. 点击 运行

查看索引编入作业信息

设置专用索引编入作业后,您可以使用 JOBS 视图查看有关索引编入作业的信息。以下 SQL 示例显示了 PROJECT_NAME 中最近的五个刷新作业。

SELECT *
FROM
  region-us.INFORMATION_SCHEMA.JOBS
WHERE
  project_id = 'PROJECT_NAME'
  AND SEARCH(job_id, '`metadata_cache_refresh`')
ORDER BY
  creation_time DESC
LIMIT 5;

PROJECT_NAME 替换为包含元数据索引编入作业的项目的名称。

配置元数据索引编入提醒

当您的 BigQuery 性能不符合定义的标准时,Cloud Monitoring 提醒进程会通知您。如需了解详情,请参阅提醒概览。借助元数据索引编入,您可以配置槽用量提醒和过时提醒。

槽用量提醒

当您的后台预留量超过其分配量的指定百分比时,此提醒会通知您。默认值为 95%。您可以为特定预留或每个后台预留配置此提醒。当此提醒触发时,我们建议您增加预留大小

如需为每个后台预留配置此提醒,请执行以下操作:

  1. 如果您尚未设置监控通知渠道,请先设置。
  2. 前往集成页面。

    前往“集成”

  3. 找到 BigQuery 集成,然后点击查看详情

  4. 提醒标签页中,选择槽用量 - 后台元数据缓存槽用量过高

  5. 可选:如需进一步自定义此提醒,请依次点击显示选项 > 自定义提醒政策

  6. 配置通知中,选择您的通知渠道。

  7. 点击创建

过时提醒

当平均列元数据索引过时与现有平均值相比增加过多时,此提醒会通知您。默认阈值为:如果超过 4 小时的平均值超过之前平均值的两倍,且持续时间超过 30 分钟。当此提醒触发时,我们建议您增加预留大小,或者如果您没有后台预留,请创建一个。

如需配置此提醒,请执行以下操作:

  1. 如果您尚未设置监控通知渠道,请先设置。
  2. 前往集成页面。

    前往“集成”

  3. 找到 BigQuery 集成,然后点击查看详情

  4. 提醒标签页中,选择列元数据索引过时 - 百分比增幅过大

  5. 可选:如需进一步自定义此提醒,请依次点击显示选项 > 自定义提醒政策

  6. 配置通知中,选择您的通知渠道。

  7. 点击创建

限制

元数据查询性能增强仅适用于 SELECTINSERTCREATE TABLE AS SELECT 语句。数据操纵语言 (DML) 语句不会由于为元数据编入索引而得到改进。

后续步骤