PostgreSQL执行MADLib机器学习查询时查询计划未包含ML操作问题咨询
问题背景
你执行的MADLib预测查询及对应EXPLAIN输出如下:
测试查询
EXPLAIN (VERBOSE, ANALYZE) SELECT COUNT(linregr.linregr_predict) FROM( SELECT madlib.linregr_predict(ARRAY[c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24,c25,c26,c27,c28], ARRAY[f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28]) FROM higgs_50_linregr_model_coef, higgs_1k_test WHERE higgs_1k_test.f1 >0.7) AS linregr;
执行计划输出
Aggregate (cost=19158.81..19158.82 rows=1 width=8) (actual time=4.607..4.610 rows=1 loops=1) -> Nested Loop (cost=0.00..1497.81 rows=117740 width=224) (actual time=0.056..1.827 rows=204 loops=1) -> Seq Scan on higgs_50_linregr_model_coef (cost=0.00..15.80 rows=580 width=112) (actual time=0.017..0.019 rows=1 loops=1) -> Materialize (cost=0.00..10.77 rows=203 width=112) (actual time=0.028..1.388 rows=204 loops=1) -> Seq Scan on higgs_1k_test (cost=0.00..9.75 rows=203 width=112) (actual time=0.018..0.531 rows=204 loops=1) Filter: (f1 > '0.7'::double precision) Rows Removed by Filter: 96 Planning Time: 0.624 ms Execution Time: 4.826 ms
问题解答
现象是否正常
该现象完全正常。
PostgreSQL的EXPLAIN输出仅展示查询优化器生成的关系算子执行计划,仅包含扫描、连接、聚合这类数据库内置的关系操作节点。MADLib的机器学习算法逻辑全部封装在自定义函数(UDF)内部,对于查询优化器来说属于黑盒计算逻辑,不会被拆解到计划树中单独展示。
MADLib查询的底层执行逻辑
- MADLib是基于PostgreSQL扩展能力开发的机器学习库,核心算法均以C语言实现的UDF/用户定义聚合函数(UDAF)的形式存在,运行时直接在数据库内核中执行,无跨进程调用开销。
- 你提供的查询实际执行流程如下:
- 顺序扫描
higgs_50_linregr_model_coef表,读取线性回归模型系数 - 顺序扫描
higgs_1k_test表,过滤得到f1>0.7的204条有效样本 - 执行嵌套循环关联,将模型系数与每条样本拼接为一行参数
- 逐行调用
madlib.linregr_predictUDF完成预测计算,该部分的耗时已经被统计到Nested Loop节点的实际执行时间中,未单独列示。
- 顺序扫描
- 如果需要查看MADLib函数的具体执行耗时,可以开启PostgreSQL的
auto_explain扩展并配置auto_explain.log_nested_statements = on,或者通过pg_stat_user_functions系统视图查询指定UDF的累计调用次数、总耗时等统计数据。
内容的提问来源于stack exchange,提问作者Ji-Hoon
相关产品推荐
相关产品推荐

