代价模型

共 22 题
#

1. MySQL 的代价模型,query_cache、engine_condition_pushdown 的影响?

A ICP 把非前缀索引条件下推到存储引擎过滤、减少回表(EXPLAIN 显示 Using index condition),query_cache 已在 8.0 移除 ✓ 正确答案
B ICP 只在全表扫描时生效
C ICP 会增加回表次数
D MySQL 8.0 仍默认启用 query_cache
#

2. PostgreSQL 的 seq_page_cost、random_page_cost、cpu_tuple_cost 等参数的语义?

A cpu_tuple_cost 表示随机读一个页的代价
B random_page_cost 默认值为 0.1
C seq_page_cost 默认 1.0 为代价基准,random_page_cost 默认 4.0 反映 HDD 随机读昂贵,SSD 上调低后者可使索引扫描更受青睐 ✓ 正确答案
D 这些参数对计划选择没有任何影响
#

3. 不同操作的代价系数,Nested Loop、Hash Join、Sort、Aggregate 的代价?

A Hash Join 永远比 Nested Loop 便宜
B Nested Loop 代价随内外层行数乘积膨胀,Hash Join 近似线性但内存溢出会落盘暴涨,Sort 是 n log n 量级 ✓ 正确答案
C Aggregate 只能使用排序实现
D Sort 的代价与行数无关
#

4. 代价模型(Cost Model)的组成,CPU、磁盘 I/O、网络 I/O 的代价权重?

A 单机数据库代价以磁盘 I/O 与 CPU 为主,分布式数据库还需计入网络 shuffle 代价,权重可通过 cost 参数或代价表配置 ✓ 正确答案
B 代价权重无法调整
C 网络代价在单机 MySQL 中占主导
D 代价模型只考虑 CPU 一种资源
#

5. 基于规则的改写(RBO)如子查询展开(unnest)、谓词推导、外连接消除与 Join 消除各自的适用条件与前提(如无空值放大、约束保证唯一)是什么?

A 谓词推导会增加中间行数
B 外连接消除不需要任何前提
C 任何子查询都可以无条件展开
D 外连接消除要求右表连接键唯一且无空值放大风险,子查询展开要求无 LIMIT/聚合副作用,Join 消除需要唯一约束保证 ✓ 正确答案
#

6. 优化器如何实现物化视图的自动查询改写(查询包含匹配 query subsumption、补偿谓词与聚合上卷)?为什么多数数据库需要显式开启且对改写失败难以诊断?

A 聚合上卷要求查询分组比视图更细
B 查询谓词被视图覆盖(subsumption)且更窄时加补偿谓词过滤,分组是视图分组的超集时可聚合上卷;自动改写多需显式开启且失败无报错难以诊断 ✓ 正确答案
C 任何聚合函数都可以直接上卷
D 物化视图改写失败会有明确报错
#

7. 代价模型对优化器选择的影响,全表扫描 vs 索引扫描?

A 索引扫描永远优于全表扫描
B 全表扫描与选择率无关
C 选择率越低索引扫描相对全表越占优,覆盖索引与较低的 random_page_cost 会进一步偏向索引,统计失真会错误地翻转该决策 ✓ 正确答案
D 覆盖索引会增加回表代价
#

8. 谓词上拉/下推与常量折叠如何改变执行计划?哪些改写必须小心外连接的 NULL 补齐语义与函数的副作用(非确定性函数)?

A 常量折叠发生在每次执行时
B 非确定性函数可以安全折叠
C 任何条件下推都不影响外连接结果
D WHERE 条件下推到外连接右表会破坏 NULL 补齐语义,非确定性函数不能折叠也不能下推到循环内层重复求值 ✓ 正确答案
#

9. Hash Join 的代价模型,哈希表内存预算与 work_mem 不足时的落盘行为,为什么其代价与输入规模近似线性、与 Nested Loop 的交叉点如何判断?

A Nested Loop 永远比 Hash Join 快
B Hash Join 代价与两表行数乘积成正比
C Hash Join 代价近似线性 O(|A|+|B|),work_mem 不足时会分批落盘使代价超线性上升,驱动集小且内层有索引时 Nested Loop 反而胜出 ✓ 正确答案
D work_mem 不影响 Hash Join 性能
#

10. MySQL optimizer_cost_model?

A 代价模型只影响 EXPLAIN 展示
B optimizer_cost_model 参数在 8.0 仍可切换模型
C 修改代价表后立即自动生效
D MySQL 8.0 的代价模型由 mysql.server_cost 与 mysql.engine_cost 表驱动,修改后需 FLUSH OPTIMIZER_COSTS 生效,optimizer_cost_model 参数已移除 ✓ 正确答案
#

11. MySQL 的代价模型差异?

A 两库的代价模型完全相同
B MySQL 也使用 random_page_cost 参数
C PG 无法配置代价权重
D MySQL 以块读取与行评估代价为主且不区分顺序/随机页权重,PG 显式区分 seq_page_cost 与 random_page_cost 并细分算子代价 ✓ 正确答案
#

12. PostgreSQL 的 cost-based optimizer?

A 代价函数不依赖统计信息
B 重写阶段完成全部代价计算
C PG 使用固定规则选择计划
D PG 的 planner 生成多种访问路径与连接顺序并用代价函数比较,动态规划枚举 join 顺序,表数超过 geqo_threshold 时回退 GEQO 近似搜索 ✓ 正确答案
#

13. 代价模型在 JOIN 顺序选择?

A join 选择率不影响顺序选择
B Hash Join 必须用大表建哈希表
C JOIN 顺序对总代价毫无影响
D "小表驱动大表"只对 Nested Loop 严格成立,Hash Join 的策略是小表建哈希表大表探测,统计失真会使顺序决策失误 ✓ 正确答案
#

14. SSD vs HDD 的代价权重差异,random_page_cost 从 4 调为 1.1?

A SSD 的随机读比 HDD 的顺序读更贵
B random_page_cost 默认 4.0 是针对 HDD 随机读昂贵设计的,SSD 上随机与顺序读差距缩小,通常下调至 1.1 左右并用真实 workload 验证 ✓ 正确答案
C random_page_cost 是 MySQL 专有参数
D 该参数只影响写入性能
#

15. 代价估算的公式,rows × cost_per_row + pages × cost_per_page?

A 代价只与行数有关
B 页数在规划期不参与估算
C 算子开销固定为零
D 总代价 ≈ 页数×每页代价 + 行数×每行代价 + 算子开销,其中页数与行数来自统计估算,统计失真直接传导为代价失真 ✓ 正确答案
#

16. random_page_cost 默认值?

A 该参数只影响 EXPLAIN 展示
B random_page_cost 默认 4.0,在 SSD 上设置过大会让优化器高估随机访问代价、过度回避索引扫描而偏向全表扫描 ✓ 正确答案
C 默认 1.0,无需任何调整
D 默认值为 0.1
#

17. Nested Loop 的代价估算,外层驱动行数 × 内层索引探测代价,为何驱动集小且内层有高效索引时胜出,其启动成本与 Merge/Hash Join 的差异?

A Nested Loop 的代价与内层探测次数无关
B Hash Join 输出第一行最快
C Nested Loop 代价约为外层行数×内层探测代价,驱动集小且内层有高效索引时胜出,且输出第一行最快,Hash Join 需先建表 ✓ 正确答案
D Merge Join 不需要任何排序或有序输入
#

18. PostgreSQL 的代价参数?

A 代价参数只影响 EXPLAIN 展示不影响真实执行
B effective_cache_size 直接决定并行度
C cpu_index_tuple_cost 默认值为 1.0
D parallel_setup_cost 与 parallel_tuple_cost 调低会鼓励并行计划,effective_cache_size 通过估算缓存命中间接影响代价,调整需用真实基准验证 ✓ 正确答案
#

19. Sort 的代价估算,内存排序与磁盘归并的成本如何建模,work_mem 不足时的 external sort 对执行时间的影响?

A external sort 不会产生任何磁盘 I/O
B work_mem 与排序性能完全无关
C 数据量超过 work_mem 时排序会落盘生成归并段并多趟合并,I/O 代价显著上升,可用调大 work_mem、索引排序或 Top-N 堆排序缓解 ✓ 正确答案
D 内存排序一定比索引排序快
#

20. 代价模型中的 cost 参数如何通过实验校准,基于真实 workload 测量顺序扫描、索引扫描与随机 I/O 的相对代价,如何避免拍脑袋调参?

A 校准只需看一眼 EXPLAIN 即可
B 代价参数与硬件介质无关
C 直接套用网上推荐值最可靠
D 应以实测的相对 I/O 耗时校准代价参数,用核心 SQL 基准集回归验证,并遵循单一变量与基线可回滚原则 ✓ 正确答案
#

21. cpu_tuple_cost 默认值?

A 该参数只影响并行计划
B cpu_tuple_cost 默认 0.01,表示处理一行元组的估算 CPU 代价约为顺序读一页的 1% ✓ 正确答案
C 默认值为 1.0
D 默认值为 4.0
#

22. seq_page_cost 默认值?

A 默认值为 4.0
B seq_page_cost 默认 1.0,是代价体系的基准单位,调优重点是保持锚点并调整 random_page_cost 等参数的相对值 ✓ 正确答案
C 默认值为 0.01
D 该参数必须随 workload 频繁大幅调整