全部产品
Search
文档中心

数据湖构建:使用 StarRocks 查询 Paimon Global Index

更新时间:Sep 17, 2026

本文介绍如何在 EMR Serverless StarRocks 中通过 DLF Catalog 查询已创建 Global Index 的 Paimon 表。

前提条件

  • 实例版本:已创建 EMR Serverless StarRocks 3.5.16-2.2.3 或以上版本的实例。

  • 地域要求:StarRocks 实例与 DLF Catalog 位于同一地域。

  • 权限配置:已为连接 StarRocks 的 RAM 用户授予DLF的API权限和目标 DLF Catalog、数据库和表的查询权限。具体操作,请参见快速配置权限。

  • 网络配置:StarRocks 实例所在的 VPC 已加入 DLF 可信名单。具体操作,请参见可信 VPC 配置。

  • 索引状态:目标 Paimon 表的 Global Index 已构建,详见构建 Global Index 实现查询加速和向量搜索。

使用限制

  • 组合查询:组合使用标量条件和数组元素条件时,不保证两个索引同时参与查询。

  • 样例数据:DLF 共享样例 Catalog 为只读,仅用于体验已有索引,不用于创建业务索引。共享样例表不保证已创建 Bitmap 或多值索引。

注意事项

  • 查询连接:参数 paimon_global_index_scan_stage 仅对当前连接生效。更换连接后,需要重新设置该参数。

  • 生效判断:查询 Paimon table_indexes 系统表只能确认索引已经提交,不能单独证明查询命中了索引。当前版本的 EXPLAIN 仅显示 PaimonScanNode,是否加速需结合 Query Profile 中的扫描和过滤指标以及实际耗时判断。

准备 StarRocks 环境

如需准备共享样例表,请参见使用 DLF 共享样例数据集。

注册 DLF Catalog

在 EMR Serverless StarRocks 的 SQL Editor 中注册指向目标 DLF Paimon Catalog 的 External Catalog:

CREATE EXTERNAL CATALOG `dlf_samples`
PROPERTIES (
    'type' = 'paimon',
    'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com',
    'paimon.catalog.type' = 'rest',
    'paimon.catalog.warehouse' = 'dlf_samples',
    'token.provider' = 'dlf'
);

参数说明:

  • uri:http://<vpc_endpoint>,其中 <vpc_endpoint> 为 StarRocks 实例所在地域的 DLF VPC Endpoint。各地域的 Endpoint,请参见地域与服务接入点。

  • paimon.catalog.warehouse:替换为目标 DLF Catalog Name。

具体操作,请参见使用 DLF Catalog。

开启分布式 Global Index 查询

在执行查询的连接中运行以下命令:

SET paimon_global_index_scan_stage = 2;

设置为 2 后,StarRocks 会先分布式读取 Global Index,再按 Row ID 读取 Paimon 数据。

快速入门

本节使用 DLF 共享样例表体验 B-tree 查询、IVF-PQ 相似图片检索和混合检索。Bitmap 和多值索引查询需要使用已构建相应 Global Index 的自建 Paimon 表。

查看共享样例表的 Global Index

查询 Paimon table_indexes 系统表,确认 B-tree 和 IVF-PQ 索引已经提交:

SELECT
    index_type,
    index_field_name,
    COUNT(*) AS index_file_count,
    SUM(row_count) AS indexed_rows
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images$table_indexes`
WHERE index_type IN ('btree', 'ivf-pq')
GROUP BY index_type, index_field_name
ORDER BY index_type, index_field_name;

查询结果应包含 weather 字段的 B-tree 索引和 image_embedding 字段的 IVF-PQ 索引,且 indexed_rows 大于 0。

使用 B-tree 按天气查询

查询 rainy 天气的图片:

SELECT
    image_id,
    event_time,
    weather,
    time_of_day,
    road_scene,
    detected_objects
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
WHERE weather = 'rainy'
LIMIT 20;

使用 IVF-PQ 查询相似图片

先从样例表读取一张图片的向量到会话变量,再执行 Top 10 查询,无需展开向量内容:

SET paimon_global_index_scan_stage = 2;
SET @query_vector = (
    SELECT image_embedding
    FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
    WHERE image_id = 'b6d82c09-e7005951'
    LIMIT 1
);

SELECT
    image_id,
    event_time,
    weather,
    time_of_day,
    road_scene,
    detected_objects,
    approx_inner_product(image_embedding, @query_vector) AS score
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
ORDER BY score DESC
LIMIT 10;

score 越大表示越相似。评分函数和排序方向必须与索引的距离度量一致。本示例使用内积和降序排列。

使用 B-tree 和 IVF-PQ 进行混合检索

复用上一步的 @query_vector,增加天气条件,同时使用 B-tree 和 IVF-PQ:

SELECT
    image_id,
    weather,
    approx_inner_product(image_embedding, @query_vector) AS score
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
WHERE weather = 'rainy'
ORDER BY score DESC
LIMIT 10;

使用 Bitmap 和多值索引查询

以下示例使用已创建 Bitmap 和多值索引的自建 Paimon 表。请将 <catalog_name>、<database_name> 和 <table_name> 替换为实际名称,并先查询 table_indexes 系统表,确认 time_of_day 字段的 Bitmap 索引和 detected_objects 字段的多值索引已构建,且 indexed_rows 大于 0:

SELECT
    index_type,
    index_field_name,
    COUNT(*) AS index_file_count,
    SUM(row_count) AS indexed_rows
FROM `<catalog_name>`.`<database_name>`.`<table_name>$table_indexes`
GROUP BY index_type, index_field_name
ORDER BY index_type, index_field_name;

按低基数字段筛选夜间图片:

SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE time_of_day = 'night'
LIMIT 20;

筛选 detected_objects 数组中包含完整元素 car 的图片:

SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE array_contains(detected_objects, 'car')
LIMIT 20;

组合标量条件与数组元素条件:

SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE time_of_day = 'night'
  AND array_contains(detected_objects, 'car')
LIMIT 20;

array_contains 表示数组元素匹配,不是字符串子串匹配。函数可以执行与谓词能够下推到 Paimon 是两项不同的能力,SQL 执行成功不能单独证明多值索引已生效。

确认当前连接的 paimon_global_index_scan_stage 为 2,再结合 Query Profile 中的扫描、过滤指标和实际耗时判断。EXPLAIN 仅出现 PaimonScanNode 不能作为命中索引的证据。本节 SQL 未在该部署环境中实际执行。

传递向量查询参数

可按需通过 ann_params 调整 IVF-PQ 查询参数。例如,运行以下命令设置 nprobe:

SET ann_params = '{"nprobe":"32"}';

nprobe 越大,通常召回率越高,查询开销也越大。未设置时使用当前版本的默认值。测试后可运行以下命令清空参数:

SET ann_params = '';

关于 IVF-PQ 的构建参数、查询参数和调优建议,请参见配置 IVF-PQ 构建和查询参数。

验证 Global Index 是否生效

确认 paimon_global_index_scan_stage 为 2。当前版本的 EXPLAIN 只显示 PaimonScanNode,是否加速应结合实际耗时和 Query Profile 判断。

SHOW VARIABLES LIKE 'paimon_global_index_scan_stage';

如未按预期加速,请先确认索引已提交、paimon_global_index_scan_stage 为 2,并检查向量维度、评分函数和排序方向是否与索引一致。

更多关于 StarRocks 湖表向量检索的原理、缓存和排查方法,请参见DLF Paimon 表向量检索。