加载中...

参数嗅探(Parameter Sniffing)指数据库在编译参数化语句或存储过程时,"嗅探"首次执行传入的具体参数值,据其估算行数并生成执行计划缓存复用;当数据分布倾斜时,该计划对其他参数值可能极不合适,表现为同一语句因参数不同而性能悬殊。
以状态列为例:status='已完成' 匹配 99% 的行,适合全表扫描;status='处理中' 只匹配少量行,适合索引查找。若首次执行传入前者,缓存的全表扫描计划会让后者的执行同样扫全表;反之亦然。症状常表现为"重启/清缓存后变快""同样的语句在不同时段计划不同"。
SQL Server 提供 OPTION (RECOMPILE)(每次重编译)、OPTIMIZE FOR 指定代表值或 UNKNOWN(按平均密度估算)、查询存储固定计划,2022 版引入参数敏感计划(PSP)优化,可按参数区间缓存多个计划;Oracle 以自适应游标共享应对,称为绑定变量窥视(Bind Peeking);PostgreSQL 的预处理语句在前几次按参数定制计划后才考虑通用计划,可用 plan_cache_mode 控制。
参数嗅探是计划缓存复用与数据倾斜之间的固有矛盾,属于设计权衡而非缺陷。

登录 后参与讨论
暂无讨论,来发表第一条评论吧