4. 数据库与 SQL 优化在核心银行场景

核心银行系统的数据库面试,考的不是“你会不会写SQL”,而是“你敢不敢为一条SQL在生产环境负责”。银行核心库通常承载账户、流水、余额、利息、总账等强一致数据,任何一次全表扫描、锁等待或索引失效,都可能演变为网点排队、跨行清算延迟甚至监管通报。因此面试官会围绕原理深度、优化方法、真实场景、风险意识四条线反复追问。本章给出一套可直接复用的回答框架,并拆解不同公司(大行、股份制、城商行、金融科技子公司)的侧重点差异。

核心银行SQL优化回答框架 ① 定位问题 ② 执行计划 ③ 索引与改写 ④ 验证与灰度 ⑤ 风险兜底:锁、回滚、监控 回答必须落到“可回滚、可观测、可复盘”

一、核心原理:面试官真正想听的底层逻辑

银行核心库以Oracle、DB2、MySQL及国产分布式数据库(如OceanBase、TDSQL、GaussDB)为主。无论哪种,面试官都希望你讲清三件事:数据如何被访问、事务如何被隔离、锁如何被持有。

  • 访问路径:B+树索引的层级、回表代价、覆盖索引、最左前缀、索引下推。核心银行查询多为“账号+日期”组合,索引设计必须贴合业务访问模式。
  • 事务与隔离:余额扣减、记账、冲正必须在一个事务内完成。要能说清RC与RR的差异、MVCC快照读、当前读,以及银行普遍采用的“短事务+补偿”策略。
  • 锁与并发:行锁、间隙锁、表锁、意向锁,以及热点账户更新导致的锁等待。核心银行常用“账户分片+异步记账”缓解热点。
回答原理时不要背概念,要落到“这条SQL在核心库上会走什么路径、持有什么锁、失败后如何回滚”。

二、方法流程:从慢SQL到生产可用的五步法

  1. 定位:从AWR、慢查询日志、APM链路中确认SQL指纹、执行频次、平均耗时与峰值耗时。
  2. 看执行计划:关注全表扫描、索引失效、回表次数、临时表、排序代价。示例:
EXPLAIN ANALYZE
SELECT acct_no, balance
FROM t_account
WHERE acct_no = '6222020200112233'
  AND stat_date = '2024-06-30';
  1. 索引与改写:补组合索引、避免函数包裹列、拆分大事务、用UNION ALL替代OR、分页改用游标或延迟关联。
  2. 验证:在预发用生产数据量级压测,对比QPS、P99、锁等待、IOPS。
  3. 灰度与兜底:先限流灰度,准备回滚脚本与监控告警,确认无锁表风险再全量。
核心银行禁止在业务高峰直接DDL或大事务更新。任何优化方案必须说明“变更窗口、回滚路径、对账影响”。

三、高频问题与回答框架

高频问题回答框架加分点
一条SQL突然变慢,怎么排查?现象→执行计划→统计信息→锁/资源→改写→验证提到执行计划突变、绑定变量窥探、统计信息过期
索引失效的常见原因?函数、隐式转换、前导通配、OR、最左前缀断裂结合银行账号类型转换的真实案例
热点账户如何优化?分片、异步、批量合并、乐观锁+重试说明余额一致性如何保证
分页深翻页怎么优化?延迟关联、游标、覆盖索引给出流水查询场景的改写SQL
大事务有什么风险?锁持有久、回滚段膨胀、主从延迟给出拆批+补偿的落地方案

四、案例/场景:热点账户扣减的优化复盘

某银行核心系统在代发工资日出现账户更新锁等待,P99从80ms升至2s。原SQL为:

UPDATE t_account
SET balance = balance - #{amt}, update_time = NOW()
WHERE acct_no = #{acctNo}
  AND balance >= #{amt};

问题在于同一账户被高频并发更新,行锁排队。优化方案:将扣减拆为“异步记账+内存合并”,对同一账户的多次扣减在应用层合并为一次批量更新,并引入版本号乐观锁:

UPDATE t_account
SET balance = balance - #{totalAmt},
    version = version + 1
WHERE acct_no = #{acctNo}
  AND version = #{version}
  AND balance >= #{totalAmt};

同时增加对账补偿任务,确保合并失败可回滚。最终P99降至120ms,锁等待下降90%。这个案例的价值在于:不仅讲SQL改写,更讲业务一致性、补偿与监控。

五、公司侧重点差异

  • 国有大行:重视DB2/Oracle原理、存储过程、批量作业、监管审计与数据一致性,回答要稳、要合规。
  • 股份制银行:重视高并发、分布式数据库、分库分表、性能压测与故障演练,回答要快、要可落地。
  • 城商行/农信:重视成本、国产化替代、迁移兼容与运维可控,回答要务实、要能兜底。
  • 金融科技子公司:重视工程化、自动化、SQL审核平台与DevOps,回答要体系化、要能沉淀工具。

六、误区与复盘

常见误区:只背“加索引”三个字;忽略统计信息与执行计划突变;把优化等同于改写SQL;不提回滚与监控;在面试中贬低旧系统。

复盘方法:每次面试后记录被追问的三个点,补齐原理与案例;用“问题—定位—方案—验证—兜底”五段式重写答案;准备一个能讲透的核心银行SQL优化项目,覆盖数据量、并发量、优化前后指标。

数据库与SQL优化在核心银行面试中,本质是考“你对生产数据的敬畏心”。把原理讲清、把流程讲全、把风险讲透,比堆砌技术名词更有说服力。