访问宽表数据

更新时间:
复制为 MD 格式

OLAP资源组支持面向宽表数据的多种查询范式,包括主键点查、非主键过滤、数据分析、全文搜索、向量检索等,并支持综合利用宽表引擎各类数据索引,实现查询自动加速。本文主要介绍访问宽表数据的多种方式。

前提条件

主键查询

主键查询是指根据主键列过滤数据的查询,可以根据全部主键列或部分主键列进行点查和范围查询。

宽表表结构示例:

-- 已建好如下宽表,宽表主键为 user_id 和 order_id
+-------------+---------------------+------+-------+---------+---------------+---------+
| Field       | Type                | Null | Key   | Default | Extra         | Comment |
+-------------+---------------------+------+-------+---------+---------------+---------+
| user_id     | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| order_id    | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| amount      | DOUBLE              | Yes  | false | NULL    |               |         |
| status      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| region      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| create_time | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
+-------------+---------------------+------+-------+---------+---------------+---------+

数据查询:

-- 等值过滤查询
SELECT * FROM orders WHERE user_id='u001' AND order_id='o10001';
-- 非等值过滤查询
SELECT * FROM orders WHERE user_id='u001' AND order_id>='o10001';
-- 部分主键过滤查询
SELECT * FROM orders WHERE user_id>='u001';

非主键查询

非主键查询是指根据非主键列过滤数据的查询。

宽表表结构示例:

-- 已建好如下宽表,宽表主键为 user_id 和 order_id
+-------------+---------------------+------+-------+---------+---------------+---------+
| Field       | Type                | Null | Key   | Default | Extra         | Comment |
+-------------+---------------------+------+-------+---------+---------------+---------+
| user_id     | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| order_id    | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| amount      | DOUBLE              | Yes  | false | NULL    |               |         |
| status      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| region      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| create_time | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
+-------------+---------------------+------+-------+---------+---------------+---------+

数据查询:

-- 等值过滤查询
SELECT * FROM orders WHERE region='Beijing';
-- 非等值过滤查询
SELECT * FROM orders WHERE create_time>='2026-02-26 10:30:00';
-- 字符串模糊匹配
SELECT * FROM orders WHERE status LIKE 'SH%';

可根据过滤字段创建二级索引搜索索引,OLAP 资源组将自动完成查询优化加速。

全文检索

如果宽表引擎数据已经构建了搜索索引,您可以通过OLAP资源组实现对普通字段和JSON字段的全文检索。

使用前提:

在执行全文检索前,请先确认目标字段已构建搜索索引,且为分词列。普通字段的索引构建方式请参考管理搜索索引,JSON 字段的索引构建方式请参考预定义子对象结构(推荐)

查询格式:

-- 普通字段检索
SELECT ${SELECT_LIST} FROM ${TABLE_NAME} WHERE ${COLUMN_NAME} MATCH '${MATCH_EXP}';
-- JSON字段检索
SELECT ${SELECT_LIST} FROM ${TABLE_NAME} WHERE get_json_string(${JSON_COLUMN_NAME}, '${JSON_PATH}') MATCH '${MATCH_EXP}';

语法说明:

变量名

变量含义

${SELECT_LIST}

查询目标列。

${TABLE_NAME}

目标表。

${COLUMN_NAME}

普通字段名。

${JSON_COLUMN_NAME}

JSON 字段名。

${JSON_PATH}

JSON 路径, 以 $ 开头,并使用 . 作为路径分隔符。

${MATCH_EXP}

匹配规则字符串,具体匹配规则请参考下方匹配规则说明。

匹配规则说明:

匹配规则由一个或多个条件构成,每个条件之间以空格分隔。一个条件可以是以下几种之一:

  • 单个词语,表示期望包含该词语,例如hello

  • 以双引号包围的短语,表示期望包含这个短语的整体,不做分词,例如"hello world"表示获取包含"hello world"短语的数据。

  • 以括号包围的另一个匹配规则,表示期望满足括号内的匹配规则,例如(another "hello world")

在条件前添加符号,可以改变该条件的匹配行为:

  • +表示该条件必须被满足。

  • -表示该条件不能被满足。

  • 不带符号时,表示该条件不必须被满足,但满足了该条件的数据可以获得更靠前的排序。

宽表表结构示例:

-- 已建好如下宽表,已对 region 和 user_json 字段建好搜索索引
+-------------+---------------------+------+-------+---------+---------------+---------+
| Field       | Type                | Null | Key   | Default | Extra         | Comment |
+-------------+---------------------+------+-------+---------+---------------+---------+
| user_id     | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| order_id    | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| amount      | DOUBLE              | Yes  | false | NULL    |               |         |
| status      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| region      | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| create_time | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| user_json   | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
+-------------+---------------------+------+-------+---------+---------------+---------+

数据查询:

-- 检索 region 字段包含 'Beijing' 或 'Shanghai' 的数据
SELECT * FROM orders WHERE region MATCH 'Beijing Shanghai';
-- 检索 region 字段可能包含 'Beijing' 但必须包含 'Shanghai' 的数据
SELECT * FROM orders WHERE region MATCH 'Beijing +Shanghai';
-- 检索 region 字段可能包含 'Beijing' 但不包含 'Shanghai' 的数据
SELECT * FROM orders WHERE region MATCH 'Beijing -Shanghai';
-- 检索 region 字段包含 'Beijing' 但不包含 'Shanghai' 的数据
SELECT * FROM orders WHERE region MATCH '+Beijing -Shanghai';
-- 检索 region 字段包含 'Beijing Chaoyang' 短语的数据
SELECT * FROM orders WHERE region MATCH '"Beijing Chaoyang"';
-- 检索 region 字段包含 'Beijing' 且同时包含 'Chaoyang' 或 'Haidian' 的数据
SELECT * FROM orders WHERE region MATCH '+Beijing +(Chaoyang Haidian)';
-- 检索 user_json 内 address 子字段包含 'Beijing' 的数据
SELECT * FROM orders WHERE get_json_string(user_json, '$.address') MATCH 'Beijing';

向量检索

如果宽表引擎数据已经构建了向量索引,可通过OLAP资源组发起对该表的向量检索——基于向量相似度完成数据召回。

查询格式:

SELECT /*+ _l_force_vector_index_(${PROPERTIES}) */ ${SELECT_LIST}[,_vector_score_(${EMBEDDING_COLUMN}, ${TARGET_VECTOR})]
FROM ${TABLE_NAME}
WHERE ${CONDITION}
ORDER BY ${DISTANCE_FUNCTION}(${EMBEDDING_COLUMN}, ${TARGET_VECTOR})
LIMIT ${K}

语法说明:

  1. 变量含义:

    变量名

    变量含义

    ${SELECT_LIST}

    查询目标列。

    _vector_score_(${EMBEDDING_COLUMN}, ${TARGET_VECTOR})

    返回相似分数,其中${EMBEDDING_COLUMN},和${TARGET_VECTOR}两个参数需要和${DISTANCE_FUNCTION}的参数相同。

    ${TABLE_NAME}

    目标表。

    ${CONDITION}

    标量过滤条件。

    ${DISTANCE_FUNCTION}

    相似距离函数,目前支持l2_distance, cosine_similarity, innerproduct_distance

    ${EMBEDDING_COLUMN}

    构建向量索引列。

    ${TARGET_VECTOR}

    目标向量 (字符串表达的浮点数组)。

    ${PROPERTIES}

    向量检索的支持的参数,比如k=10, lvector.min_score=0

  2. 距离函数:支持 l2_distance, cosine_similarity, innerproduct_distance 。

  3. Hint:通过 /*+ _l_force_vector_index_(...) */ 查询向量索引和配置向量查询参数,支持的参数如下:

    参数

    是否必填

    说明

    k

    返回最相似的K个数据,请注意参数kLIMIT需要保持一致。

    lvector.min_score

    相似度阈值,要求返回的向量得分大于该值。返回的向量得分范围为[0,1]。

    取值范围:[0,+inf]。默认值为0

    lvector.ef_search

    HNSW算法中,索引查询时动态列表的长度。只能用于HNSW算法。

    取值范围:[1,1000]。默认值为100

    lvector.nprobe

    要查询的聚类单元(cluster units)的数量。请根据您的召回率要求,对该参数的值进行调整已达到理想效果。值越大,召回率越高,搜索性能越低。

    取值范围:[1,method.parameters.nlist]。无默认值。

    重要

    仅适用于ivfpq算法。

    lvector.reorder_factor

    使用原始向量创建重排序(reorder)。ivfpq算法计算的距离为量化后的距离,会有一定的精度损失,需要使用原始向量进行重排序。比例为k * reorder_factor ,通常用于提升召回精度,但会增加性能开销。

    取值范围:[1,200]。默认值为10

    重要

    重要
    • 仅适用于ivfpq算法。

    • k值较小时可以设置为5,如果k大于100,直接设置为1即可。

    lvector.client_refactor

    是否不在每个分片(Shard)内进行重排序,而是在系统上层进行重排序,进而提升系统性能。取值如下:

    • true:是。

    • false(默认值):否。

    lvector.filter_type

    融合查询使用的模式。取值如下:

    • pre_filter:先过滤结构化数据,再查询向量数据。

    • post_filter:先查询向量数据,再过滤结构化数据。

宽表表结构示例:

-- 已建好如下宽表,已对 item_embedding 列创建向量索引
+----------------+---------------------+------+-------+---------+---------------+---------+
| Field          | Type                | Null | Key   | Default | Extra         | Comment |
+----------------+---------------------+------+-------+---------+---------------+---------+
| user_id        | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| order_id       | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| amount         | DOUBLE              | Yes  | false | NULL    |               |         |
| status         | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| region         | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| create_time    | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| item_embedding | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
+----------------+---------------------+------+-------+---------+---------------+---------+

数据查询:

-- 根据输入特征向量,检索最相似的前 10 个商品订单
SELECT /*+ _l_force_vector_index_(k=10, lvector.min_score=0) */ 
    user_id,
    order_id
FROM orders
WHERE region='Beijing'
ORDER BY l2_distance(item_embedding, '[0.077, 0.941, 0.917, 0.347, 0.331, 0.309, 0.127, 0.990]')
LIMIT 10;

-- 根据输入特征向量,检索最相似的前 10 个商品订单,并返回相似分数
SELECT /*+ _l_force_vector_index_(k=10, lvector.min_score=0) */ 
    user_id,
    order_id,
    _vector_score_(item_embedding, '[0.077, 0.941, 0.917, 0.347, 0.331, 0.309, 0.127, 0.990]')
FROM orders
WHERE region='Beijing'
ORDER BY l2_distance(item_embedding, '[0.077, 0.941, 0.917, 0.347, 0.331, 0.309, 0.127, 0.990]')
LIMIT 10;

复杂分析

对海量数据进行复杂过滤、关联计算、聚合分析,支持SQL语法参考中的各类SQL算子。

宽表表结构示例:

-- 已建好如下宽表
+----------------+---------------------+------+-------+---------+---------------+---------+
| Field          | Type                | Null | Key   | Default | Extra         | Comment |
+----------------+---------------------+------+-------+---------+---------------+---------+
| user_id        | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| order_id       | VARCHAR(1073741824) | No   | true  | NULL    | partition key |         |
| amount         | DOUBLE              | Yes  | false | NULL    |               |         |
| status         | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| region         | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| create_time    | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
| item_embedding | VARCHAR(1073741824) | Yes  | false | NULL    |               |         |
+----------------+---------------------+------+-------+---------+---------------+---------+

数据查询:

  1. 大范围数据聚合

    SELECT
      region,
      COUNT(*) AS order_cnt,
      SUM(amount) AS gmv,
      AVG(amount) AS aov
    FROM orders
    WHERE region IN ('Shanghai', 'Beijing')
    GROUP BY region
    ORDER BY gmv DESC;

    可创建列存索引,OLAP 资源组将自动完成查询优化加速。

  2. UNION 查询

    (
      -- 非主键数据查询
      SELECT user_id, order_id, amount, status, region, create_time
      FROM orders
      WHERE region='Beijing'
    )
    UNION ALL
    (
      -- 非主键数据检索
      SELECT user_id, order_id, amount, status, region, create_time
      FROM orders
      WHERE status LIKE 'SH%'
    );

    可根据过滤字段创建二级索引搜索索引,OLAP 资源组将自动完成查询优化加速。

参数说明

在索引构建完成后,OLAP 资源组默认开启索引自动优化,查询时会自动选择合适的索引加速查询,如果您需要强制使用或不使用索引,可以在查询时添加 Hint。如果您需要关闭索引的自动优化,可以配置会话参数。

索引名称

Hint

会话参数

二级索引

/*+ _l_force_secondary_index_*/

/*+ _l_disable_secondary_index_*/

enable_lindorm_secondary_index

搜索索引

/*+ _l_force_search_index_*/

/*+ _l_disable_search_index_*/

enable_lindorm_search_index

列存索引

/*+ _l_force_columnar_index_*/

/*+ _l_disable_columnar_index_*/

enable_lindorm_columnar_index

基础特性

/*+ _l_force_vector_index_*/

/*+ _l_disable_vector_index_*/

enable_lindorm_vector_index

Hint l_force为强制使用索引,l_disable为强制不使用索引,会话参数可以通过 SET {variable_name}=true/false配置,配置为 true 时开启索引自动优化,配置为 false 时关闭索引自动优化。