# 1. 迭代器模型(Volcano Model)与向量化执行模型的工程边界,传统火山模型的虚函数开销如何被向量化消除? A 火山模型逐行调用 next() 的虚函数开销是向量化执行希望消除的核心问题 ✓ 正确答案 B 向量化执行的主要开销来自每一行都要做一次内存分配 C 向量化执行必须放弃索引扫描,只能做全表扫描 D 火山模型在 OLAP 大批量扫描场景下的性能始终优于向量化
# 2. 编译执行(CodeGen/LLVM/Codegen-in-DB)相对解释执行的 5-10× 加速原理与代价? A 编译执行总能比解释执行快,代价可以忽略 B 编译执行把解释层的动态分派、类型检查开销消除,但需要付出编译时间与代码膨胀的代价 ✓ 正确答案 C 编译执行只适合 OLTP 小查询,不适合 OLAP 大批量查询 D 编译执行必须使用 LLVM,无法手工生成代码
# 3. Pull(火山模型)与 Push(物化/向量化)执行模型的差异,为什么现代 OLAP 引擎逐步转向 Push/向量化,OLTP 引擎为何保留火山模型? A OLAP 引擎保留火山模型是因为其简单且能满足大批量吞吐 B 火山模型与 Push 模型在数据流动方向上没有区别 C OLTP 引擎转向 Push 模型的主要原因是单条查询数据量大 D Push 模型便于算子间流水线化并减少中间结果物化,因此被 OLAP 引擎采用 ✓ 正确答案
# 4. Late Materialization(延迟物化),列存下先处理列元数据再取整行,为什么能减少中间结果物化与 IO? A 延迟物化会立即把整行拼接成行式记录 B 延迟物化只适用于行存,不适用于列存 C 延迟物化先只处理需要的列并保留行号,最后才按需取回整行,从而减少中间物化与 IO ✓ 正确答案 D 延迟物化一定会增加内存占用
# 5. 流水线执行(pipeline execution)相比火山模型如何消除流水线阻塞(pipeline breakers) A 流水线执行能彻底消除排序、hash join 等全量算子的必要性 B 火山模型本身不存在 pipeline breaker C 流水线执行把查询拆成阶段,阶段内算子以批量连贯流动,减少逐行等待与物化造成的阻塞 ✓ 正确答案 D 流水线执行只适用于单线程,无法并行
# 6. 自适应查询执行(Adaptive Query Execution, AQE),运行时调整 Join 策略、Join 顺序、Partition 数的工程实现? A AQE 在运行时根据实际执行的中间结果动态调整 Join 策略、分区数等,以纠正静态估计偏差 ✓ 正确答案 B AQE 只在编译期根据静态统计信息决定计划,运行期不再改动 C AQE 只能调整 join 顺序,不能调整分区数 D AQE 会降低查询性能,因为它无法利用运行时信息
# 7. 表达式求值(Expression Evaluation)的向量化,批量 SIMD 加速与列存优势? A 向量化表达式求值仍然逐行调用表达式树,只是加速了内存分配 B 列存数据不连续,无法被向量化利用 C 向量化只适用于 null 判断,不适用于算术运算 D 向量化把表达式内循环改为对同一列连续元素批量执行,配合 SIMD 并行计算,列存使其更契合 ✓ 正确答案
# 8. 并行执行框架,Exchange/Repartition 算子如何切分与重分布数据,并行度选择与数据倾斜的动态处理? A Exchange 算子只在本地合并数据,不涉及跨节点重分布 B Exchange 按分区键把数据重分布到多个实例,数据倾斜可动态检测并加盐/拆分处理 ✓ 正确答案 C 并行度固定设为 CPU 核数即可,无需考虑数据量 D 数据倾斜只会影响单线程,不影响并行执行
# 9. 谓词下推与投影下推在执行计划中的落实,为什么下推能减少算子间传递的行数与列数? A 投影下推让扫描阶段只读需要的列,谓词下推让过滤提前执行,共同减少传递的行数与列数 ✓ 正确答案 B 谓词下推会增加算子间传递的行数 C 下推优化只影响 IO,不影响 CPU 与内存 D 下推会改变查询结果
# 10. 执行引擎的内存管理,Operator 的 Spill-to-Disk 与查询内存预算如何协同,避免 OOM 与过度落盘? A 内存预算与落盘是竞争关系,落盘越多越好 B 落盘只发生在排序算子,hash join 不会落盘 C 算子超出预算时用 Spill-to-Disk 换内存避免 OOM,但需避免过度落盘带来的性能损失 ✓ 正确答案 D 内存预算应固定不变,不能动态调整
# 11. 火山模型 vs 向量化,逐行虚函数调用 vs 批量 SIMD? A 火山模型逐行调用虚函数,控制流开销大;向量化对批量列数据做 SIMD,减少该开销 ✓ 正确答案 B 向量化与火山模型在逐行调用方式上完全相同 C SIMD 只能用于整数运算,不能用于比较 D 火山模型因为逐行调用所以吞吐更高
# 12. MPP 执行引擎的跨节点数据传输(Exchange 网络开销)与本地执行的比例 A 跨节点网络传输开销通常相对本地计算较低,可忽略 B 应尽量让数据在本地节点处理,通过分区键对齐和本地预聚合减少跨节点 Exchange 传输 ✓ 正确答案 C MPP 的所有计算都必须在中心节点完成 D 数据本地性和网络传输速度无关
# 13. 并行执行框架,Exchange 算子、数据倾斜动态检测与重分布? A 数据倾斜是固定的,只能在数据加载时解决 B 运行时检测各分区大小与均值差异识别倾斜,并通过加盐拆分、广播、动态分区等手段重分布 ✓ 正确答案 C Exchange 算子不参与数据重分布 D 倾斜只会导致内存浪费,不影响查询时间
# 14. UDF 与表达式为何成为向量化执行的瓶颈,如何用批量调用、编译或内置函数替代逐行 UDF? A 内置函数与 UDF 在性能上完全相当 B UDF 天然支持向量化,无需任何处理 C UDF 逐行调用会破坏向量化内循环,需通过批量调用、编译或内置函数替代来缓解 ✓ 正确答案 D UDF 只影响 IO,不影响 CPU 计算
# 15. 编译执行(Codegen)与解释执行的性能差异? A 编译执行无法用于表达式,只能用于整个查询 B 解释执行永远比编译执行快 C 编译执行消除了解释层的分派与类型检查开销,性能更高,但需承担编译时间成本 ✓ 正确答案 D 编译执行与解释执行性能完全相同
# 16. 执行引擎的 push/pull 模型,物化与流水线的差异? A 流水线必须完整物化全部中间结果 B 物化与流水线没有区别 C 物化把中间结果完整生成后再消费,流水线让数据边生成边消费,后者通常更省内存、延迟更低 ✓ 正确答案 D 物化只适用于 OLAP,不适用于 OLTP
# 17. 并行执行,Exchange 算子与数据重分布? A 所有查询都强制需要 Exchange 算子 B Exchange 只做本地内存拷贝,不涉及网络 C 数据重分布不会影响并行度 D Exchange 通过 hash/range 分区把数据重分布到并行实例,是实现并行 join/聚合的基础,但带来网络开销 ✓ 正确答案
# 18. 用 EXPLAIN ANALYZE 解读算子耗时与行数偏差(执行计划诊断) A 对比估算行数与实际行数可发现基数估计偏差,结合耗时分布定位瓶颈算子 ✓ 正确答案 B EXPLAIN ANALYZE 只显示估算行数,无法反映实际执行 C EXPLAIN ANALYZE 只能用于 SELECT,不能用于带 join 的查询 D 行数偏差永远不影响执行计划质量