查询执行模型

共 18 题
#

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 行数偏差永远不影响执行计划质量