谓词改写、JIT 与执行优化

共 36 题
#

1. IN/EXISTS 改写为 JOIN 的等价条件与性能差异?

A IN 改写为 JOIN 时无需考虑去重问题。
B 子查询含聚合时优化器最容易展开。
C EXISTS 子查询永远无法改写为 JOIN。
D 优化器能自动展开子查询时,IN/EXISTS 与 JOIN 性能接近。 ✓ 正确答案
#

2. NOT IN 改写为 NOT EXISTS 的 NULL 陷阱?

A NOT IN 在子查询含 NULL 时行为与 NOT EXISTS 完全一致。
B NOT EXISTS 对 NULL 处理是有问题的。
C NOT IN 遇到子查询中的 NULL 时结果可能为空,称为 NULL 陷阱。 ✓ 正确答案
D NULL 不影响任何比较运算。
#

3. 子查询展开(Subquery Unnesting),将子查询转为 JOIN 提升优化器能力?

A 子查询展开把子查询从逐行执行转为 JOIN/半连接,扩大优化空间。 ✓ 正确答案
B 子查询展开总是成功,无任何限制。
C 子查询展开会降低优化器能力。
D 子查询展开只适用于 MySQL。
#

4. 标量子查询改写为 LEFT JOIN 的性能?

A 标量子查询永远比 LEFT JOIN 快。
B 标量子查询改写为 LEFT JOIN 通常能利用连接优化,避免逐行执行。 ✓ 正确答案
C LEFT JOIN 改写会改变 NULL 语义。
D 标量子查询无法改写为连接。
#

5. 相关子查询的优化,去相关(Decorrelation)的代价?

A 去相关会降低查询正确性。
B 去相关总是免费,无任何代价。
C 相关子查询无法去相关。
D 去相关将相关子查询转为连接,避免逐行执行,但可能引入去重等代价。 ✓ 正确答案
#

6. 谓词下推(Predicate Pushdown)的优化,尽早过滤减少数据量?

A 谓词下推把过滤条件推迟到最后。
B 谓词下推把过滤条件尽量下沉到扫描层,尽早减少数据量。 ✓ 正确答案
C 谓词下推会增加中间结果。
D 谓词下推只适用于单表查询。
#

7. 派生表(Derived Table)的优化器合并(Derived Merge)?

A 含聚合的派生表最容易合并。
B 派生表总是被物化,无法合并。
C 派生表合并把派生表内容展开进外层查询,避免物化,通常更高效。 ✓ 正确答案
D 派生表合并会降低优化能力。
#

8. 标量子查询改写为 JOIN?

A LEFT JOIN 与标量子查询的 NULL 语义不同。
B 标量子查询改写为 JOIN 一定更快且无需去重。
C 标量子查询改写为 JOIN 需保证子查询返回单行,否则可能放大行数。 ✓ 正确答案
D 标量子查询无法改写为 JOIN。
#

9. 相关子查询的执行次数(在执行计划与 SQL 优化范畴内)?

A 相关子查询总是只执行一次。
B 未去相关的相关子查询每外层行执行一次,外层行数大时代价很高。 ✓ 正确答案
C 去相关会增加子查询执行次数。
D 相关子查询执行次数与外层行数无关。
#

10. Hash Aggregate 的内存占用,哈希表超出 work_mem 时落盘?

A HashAggregate 的哈希表不受 work_mem 限制。
B HashAggregate 不使用哈希表。
C work_mem 不影响 HashAggregate。
D 哈希表超出 work_mem 时会落盘,性能下降。 ✓ 正确答案
#

11. work_mem 参数对排序的影响,默认 4MB,复杂查询需上调?

A work_mem 默认 4MB,是全局共享上限。
B work_mem 只影响连接池。
C work_mem 是每个操作实例的限额,复杂查询可上调但需评估并发内存。 ✓ 正确答案
D work_mem 无法修改。
#

12. Sort 节点的 EXPLAIN 解读?

A Sort Method 为 external merge 表示排序在内存完成。
B ORDER BY 列有索引时也必然出现 Sort 节点。
C Sort Key 反映 ORDER BY 列,Sort Method 反映内存/磁盘排序。 ✓ 正确答案
D Sort 节点信息无法用于优化。
#

13. MySQL 8.0 并行查询的应用场景,SELECT ... FOR UPDATE?

A MySQL 8.0 并行 read 支持所有加锁查询。
B SELECT ... FOR UPDATE 因涉及锁语义,不适合并行 read。 ✓ 正确答案
C 并行 read 只适用于写操作。
D MySQL 并行查询能力强于 PostgreSQL 的并行查询。
#

14. PostgreSQL JIT 的应用,表达式求值、聚合函数、tuple deforming?

A JIT 只对简单查询有效。
B JIT 通过 LLVM 编译表达式、聚合、tuple deforming 等热路径加速执行。 ✓ 正确答案
C JIT 没有编译开销。
D JIT 只影响 I/O 不涉及 CPU。
#

15. PostgreSQL 中 max_parallel_workers、max_parallel_workers_per_gather 参数?

A max_parallel_workers 是单查询 worker 上限。
B max_parallel_workers_per_gather 是单个查询的 worker 上限,全局 worker 总和受 max_parallel_workers 限制。 ✓ 正确答案
C 两个参数互不影响。
D 并行度只受表大小影响。
#

16. CTE 多次引用的代价,物化避免重复计算但需物化一次?

A CTE 无法物化。
B 物化 CTE 总是无代价。
C CTE 只引用一次时物化收益最大。
D 物化 CTE 可避免多次引用时重复计算,但需一次性构建代价。 ✓ 正确答案
#

17. CTE 的内联(Inline)与物化(Materialized)选择,PostgreSQL 12+ 默认内联?

A 物化总是优于内联。
B PostgreSQL 12+ 总是物化 CTE。
C 内联是优化屏障,无法与外层合并。
D PostgreSQL 12+ 默认对只引用一次的 CTE 内联,而非总是物化。 ✓ 正确答案
#

18. CTE 与子查询的执行计划差异(在执行计划与 SQL 优化范畴内)?

A CTE 与子查询永远计划相同。
B PostgreSQL 11 前 CTE 物化是优化屏障,12+ 默认对单次引用 CTE 内联。 ✓ 正确答案
C 子查询总是被物化。
D CTE 无法被内联。
#

19. CTE 的 EXPLAIN 解读?

A CTE 物化时无任何节点。
B CTE 内联时有 CTE Scan 节点。
C CTE 物化时计划中出现 CTE Scan 节点,内联时直接展开。 ✓ 正确答案
D CTE 无法从 EXPLAIN 判断。
#

20. PostgreSQL 12+ 的 CTE 行为?

A PostgreSQL 12+ 默认总是物化 CTE。
B PostgreSQL 12+ 默认对单次引用的 CTE 内联,消除优化屏障。 ✓ 正确答案
C CTE 内联无法与外层做谓词下推。
D PostgreSQL 12+ 的 CTE 行为与 11 完全相同。
#

21. 直方图的更新频率(在执行计划与 SQL 优化范畴内)?

A 直方图由 ANALYZE 采集,数据变化后需重新 ANALYZE 保持准确。 ✓ 正确答案
B 直方图是静态的,永不更新。
C 直方图只影响排序不影响行数估算。
D 直方图更新频率与优化无关。
#

22. Buffer Pool 的 LRU-K 算法,热点页缓存?

A LRU-K 不适用数据库缓存。
B LRU-K 与普通 LRU 完全一样。
C LRU-K 会把顺序扫描页放入热区。
D LRU-K 通过记录访问历史避免单次访问污染,保护热点页。 ✓ 正确答案
#

23. 查询结果缓存(Result Cache)的实现,内存中缓存哈希键查询?

A Result Cache 按参数键哈希缓存结果,重复参数查询直接命中。 ✓ 正确答案
B Result Cache 缓存所有查询结果,无内存限制。
C Result Cache 对参数组合不重复的查询收益最大。
D Result Cache 不涉及内存。
#

24. 物化视图在 OLAP 中的应用,预聚合如何加速报表查询,增量刷新与全量刷新的代价,与列存/实时数仓的互补关系?

A 物化视图每次都实时聚合明细。
B 物化视图总是全量刷新且无代价。
C 物化视图与列存、实时数仓完全冲突。
D 物化视图预聚合结果,报表直达,增量刷新代价低于全量刷新。 ✓ 正确答案
#

25. 物化视图的刷新策略(在执行计划与 SQL 优化范畴内)?

A 全量刷新重算全部数据,CONCURRENTLY 可并发但需唯一索引。 ✓ 正确答案
B 增量刷新代价高于全量刷新。
C 物化视图刷新总是阻塞查询。
D 物化视图无法增量刷新。
#

26. OR 条件改写为 UNION 的成本对比?

A OR 条件无法利用索引。
B OR 改写为 UNION 总是更快。
C OR 改写为 UNION 可让各分支分别走索引,但引入去重与合并代价。 ✓ 正确答案
D index merge 与 UNION 改写完全无关。
#

27. GroupAggregate 与 HashAggregate 的取舍,输入有序 vs 哈希?

A GroupAggregate 总是用哈希表。
B GroupAggregate 要求输入有序,HashAggregate 用哈希表且不要求有序。 ✓ 正确答案
C HashAggregate 要求输入有序。
D 两者实现完全相同。
#

28. Sort 节点的代价,内存排序 vs 外部归并排序(on-disk)?

A work_mem 不影响排序方式。
B 内存排序需要磁盘 I/O。
C 两种排序代价相同。
D 外部归并排序因磁盘 I/O 代价远高于内存排序。 ✓ 正确答案
#

29. 外部排序(External Sort)的磁盘 I/O 代价估算?

A 外部排序 I/O 近似数据量乘以(写入加归并轮数乘 2),归并轮数越多 I/O 越大。 ✓ 正确答案
B 外部排序 I/O 与数据量无关。
C 归并轮数不影响 I/O。
D 外部排序只在内存进行。
#

30. Hash Aggregate 的内存限制?

A work_mem 不影响 HashAggregate。
B HashAggregate 不受内存限制。
C HashAggregate 不使用哈希表。
D HashAggregate 的哈希表受 work_mem 限制,超限会落盘。 ✓ 正确答案
#

31. JIT(Just-In-Time)编译的原理,LLVM 编译表达式?

A JIT 只适合简单查询。
B JIT 只解释不编译。
C JIT 编译无任何开销。
D JIT 用 LLVM 把表达式、聚合等热路径编译为机器码,减少解释开销。 ✓ 正确答案
#

32. 并行查询(Parallel Query)的原理,leader worker + 多 worker 协同?

A 并行查询不需要 worker 进程。
B 并行查询只有一个 worker。
C Gather 节点下方是串行执行。
D 并行查询中 leader 协调,Gather 节点汇总各 worker 的部分结果。 ✓ 正确答案
#

33. 并行查询的代价,worker 协调、内存使用?

A 并行查询没有任何额外代价。
B 并行查询引入 worker 协调与内存放大代价,数据量小时可能得不偿失。 ✓ 正确答案
C 并行度越高查询一定越快。
D 并行不占用额外内存。
#

34. 采样的频率与代价,ANALYZE 的样本大小?

A 采样越大 ANALYZE 越快。
B ANALYZE 采样大小与频率共同决定统计准确性,需权衡精度与代价。 ✓ 正确答案
C 统计频率不影响估算精度。
D ANALYZE 不采样数据。
#

35. EXISTS 与 IN 的执行计划?

A EXISTS 永远比 IN 计划好。
B 现代优化器可将 EXISTS 与 IN 都转为半连接,计划往往相似。 ✓ 正确答案
C IN 无法转为半连接。
D 两者总是退化为逐行执行。
#

36. MySQL Query Cache(已废弃)的历史与教训?

A Query Cache 的失效与表更新无关。
B Query Cache 在写多读少场景性能极佳。
C Query Cache 只在 MySQL 8.0 存在。
D Query Cache 因表更新导致整体缓存失效并引入锁竞争,在写多场景反而降低性能而被废弃。 ✓ 正确答案