Lance 外表查询无需预先导入数据或创建列存索引。查询支持行式执行(MySQL 原生执行器),也可使用 IMCI 加速执行。需要 IMCI 加速时,可选择单节点 IMCI 或 MPP 并行执行。
执行路径的选择参考如下:
行式执行:适用于过滤、JOIN、聚合、排序等查询场景。大数据量关联分析可能耗时较长,强烈建议使用 IMCI 加速。
单节点 IMCI:禁用 MPP 并行执行,查询通过 IMCI 在单个节点执行。
MPP 并行执行:跨节点并行执行,面向海量数据分析场景,使用前需提交工单开通集群的 IMCI MPP 功能。
查询处理流程如下所示:
适用范围
执行查询前,需满足以下通用前提:
已满足使用前提与功能限制中的要求。
账号具有待查询表的
SELECT权限。已创建待查询外表。
如需在读写节点(RW)读取,已开启
loose_lance_allow_reads_on_rw。
不同执行路径还需满足以下专属前提:
IMCI 加速查询(单节点 IMCI、MPP 并行执行):节点已启用 IMCI。
MPP 并行执行:
请提交工单,联系我们为您开通集群的 IMCI MPP 功能并完成配置。
所有 Worker 节点均能访问 OSS,并具有相应访问权限。
使用 REST Namespace 时,所有 Worker 节点均能访问 Namespace 服务并通过身份认证。
行式执行
行式执行适用于过滤、JOIN、聚合、排序等查询场景,支持与当前节点可访问的 InnoDB、X-Engine 行存表及 MyISAM 表 JOIN,JOIN 列类型需兼容。
本文示例中的 example_* 为占位名称,SET SESSION 仅影响当前连接,未包含 USE example_db; 的示例默认已选中目标数据库。
以下示例先关闭列式执行引擎,再执行查询,最后读取 Last_stmt_use_imci 会话状态变量:若返回 FALSE,则查询为行式执行。
SET SESSION use_imci_engine = OFF;
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';采用行式执行进行大数据量关联分析时,查询可能耗时较长,建议在满足条件时使用 IMCI 加速。涉及本地 InnoDB 表时,应为其添加覆盖查询所需列的 IMCI 索引,并确认索引已构建完成且可读。具体操作请参见列存索引的列存索引使用说明。
使用 IMCI 加速查询
以下示例会调整 use_imci_engine 和 imci_plan_use_mpp 参数:
use_imci_engine控制是否使用 IMCI,取值行为如下:取值
行为
OFF只使用行式执行。
ON优先尝试 IMCI,在允许回退时使用行式执行。
FORCED强制使用 IMCI,无法执行时返回错误。
imci_plan_use_mpp控制是否采用 MPP。OFF禁用 MPP 并行执行,查询通过单节点 IMCI 执行。NO_FALLBACK要求查询不回退单节点 IMCI 执行。重要与本地表关联时,若存在无法使用 IMCI 的表(例如 InnoDB 表没有可用的 IMCI 索引,或索引未覆盖查询所需列),
use_imci_engine=ON时整条查询(包括 Lance 外表读取)会回退到行式执行。use_imci_engine=FORCED时则报错。
单节点执行
以下示例设置 use_imci_engine=FORCED,强制查询通过 IMCI 执行。设置 imci_plan_use_mpp=OFF,禁用 MPP 并行执行。接下来执行查询,再读取 Last_stmt_use_imci 会话状态变量:若返回 TRUE,则查询使用 IMCI 加速。结合 imci_plan_use_mpp=OFF,可确定为单节点 IMCI 执行。
USE example_db;
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';MPP 并行执行
MPP 的适用场景和使用说明,请参见使用多机 MPP 对海量数据分析提速。完成开通后,连接对应的 MPP 执行组执行查询。
以下示例设置 use_imci_engine=FORCED,要求查询通过 IMCI 执行,无法使用时会报错。设置 imci_plan_use_mpp=NO_FALLBACK,要求查询不回退单节点 IMCI 执行。接下来使用 EXPLAIN ANALYZE 验证查询的实际执行方式:该命令会实际执行查询并返回执行统计,正常查询时去掉 EXPLAIN ANALYZE 前缀即可。之后读取 Last_stmt_use_imci 会话状态变量。
USE example_db;
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = NO_FALLBACK;
EXPLAIN ANALYZE
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';执行完成后,从以下两方面确认执行方式:
确认使用 IMCI:查询成功后,读取
Last_stmt_use_imci会话状态变量,返回TRUE表示本次查询使用了 IMCI,但不一定跨节点 MPP 并行执行。imci_plan_use_mpp=NO_FALLBACK是 MPP 执行控制参数,不能替代EXPLAIN ANALYZE实际验证。确认 MPP 跨节点执行:检查本次
EXPLAIN ANALYZE成功返回的结果,确认包含A-Rows、Execution Time(s)等实际执行统计,以及Consume和Exchange算子。在这些算子的Extra Info中,将Producers(生产节点)和Consumers(消费节点)列出的节点 ID 合并去重。若至少包含两个不同 ID,则表示本次查询已采用跨节点 MPP 执行。
下推能力
Lance 外表支持将过滤条件和符合要求的 LIMIT/OFFSET 下推到 Lance 读取层。各执行路径的下推能力支持范围如下:
执行路径 | 过滤下推 | LIMIT/OFFSET 下推 |
行式执行 | 支持 | 不支持 |
单节点 IMCI | 支持 | 满足条件时支持 |
MPP 并行执行 | 支持 | 不支持 |
以下示例均使用单节点 IMCI,可通过 EXPLAIN ANALYZE 判断是否实际发生下推。
过滤下推
lance_enable_filter_pushdown 控制过滤下推,默认开启。
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION lance_enable_filter_pushdown = ON;
EXPLAIN ANALYZE
SELECT example_id FROM example_table
WHERE example_id BETWEEN 1 AND 5;执行计划中出现 Lance Filter Pushed Down: true,表示本次查询有过滤条件下推到 Lance。该标记不代表全部过滤条件都已下推。
LIMIT/OFFSET 下推
单节点 IMCI 的查询在满足条件时,可以将 LIMIT/OFFSET 下推到 Lance。该优化由 imci_optimizer_switch 中的 lance_limit_pushdown 控制:
有过滤条件时:必须开启
lance_enable_filter_pushdown,且先于 LIMIT/OFFSET 执行的全部过滤条件都能完整下推到 Lance。仅能部分下推或仍需在执行层完成过滤时,不下推 LIMIT/OFFSET。没有过滤条件时:LIMIT/OFFSET 可独立下推,不依赖过滤下推开关。即使
lance_enable_filter_pushdown=OFF,也可生效。
此外,LIMIT/OFFSET 必须直接作用于扫描和过滤操作,不能穿过排序、关联或聚合等操作,执行计划中也不能包含 Exchange 算子。是否实际下推,以 EXPLAIN ANALYZE 中的 Lance Limit Pushed Down: true 为准。判断是否跨节点 MPP 执行,仍需按前文方法核对节点 ID。
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION imci_optimizer_switch = 'lance_limit_pushdown=on';
EXPLAIN ANALYZE
SELECT example_id FROM example_table
LIMIT 3 OFFSET 1;执行计划中出现以下信息,表示 LIMIT/OFFSET 已下推:
Lance Limit Pushed Down: true
Lance Limit: 3
Lance Offset: 1按 _rowid 读取
_rowid 是 Lance 提供的行地址。按 _rowid 读取需在外表定义中显式声明,自动发现列不会添加该列。以下示例在可读取 Lance 的 RW 节点执行,先重建显式声明 _rowid 列的 example_table 外表映射,再按 _rowid 读取 example_id。
DROP FOREIGN TABLE IF EXISTS example_table;
CREATE FOREIGN TABLE example_table (
example_id BIGINT NOT NULL,
_rowid BIGINT UNSIGNED NOT NULL
) ENGINE=LANCE
CONNECTION='server://example_oss/example_table.lance';
SELECT example_id FROM example_table WHERE _rowid IN (1, 2) ORDER BY example_id;数据一致性与更新可见性
每条查询执行期间,参与查询的各节点读取同一 Lance 外表的固定数据集地址、版本和表结构,不随写入的新版本而变化。MPP 并行执行时,各 MPP Worker 同样使用该表的同一快照和表结构,确保各节点读取一致。该保证以单条语句、单张表为范围,不提供事务级或多表全局快照。后续查询对数据更新的可见性及表结构变更的处理,请参见外表映射维护。