BigQuery 表的元数据索引

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

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

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

查看元数据索引刷新时间

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

  1. 在 Google 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:您的 Google Cloud 项目的 ID。如果未指定,则使用默认项目。
    • REGION:项目所在的区域,例如 region-us
  3. 点击 运行

查看列元数据索引用量

如需查看作业完成后是否使用了列元数据索引,请检查 Job 资源的 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. 在 Google 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. 在 Google 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. 提醒标签页中,选择 Slot Usage - Background Metadata Cache Slot Usage Too High

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

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

  7. 点击创建

过时提醒

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

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

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

    前往“集成”

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

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

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

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

  7. 点击创建

限制

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

后续步骤