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资源组实现对普通字段和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}语法说明:
变量含义:
变量名
变量含义
${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。距离函数:支持
l2_distance,cosine_similarity,innerproduct_distance。Hint:通过
/*+ _l_force_vector_index_(...) */查询向量索引和配置向量查询参数,支持的参数如下:参数
是否必填
说明
k
是
返回最相似的K个数据,请注意参数
k和LIMIT需要保持一致。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 | | |
+----------------+---------------------+------+-------+---------+---------------+---------+数据查询:
大范围数据聚合
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 资源组将自动完成查询优化加速。
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 资源组默认开启索引自动优化,查询时会自动选择合适的索引加速查询,如果您需要强制使用或不使用索引,可以在查询时添加 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 时关闭索引自动优化。