同一条SQL为何执行计划会突然变化:从参数嗅探到多计划缓存的技术突围

想象这样一个场景:你的生产环境中有一个存储过程,平时执行只需几百毫秒,突然某天开始,同样的调用却需要几分钟甚至更长时间。你检查了服务器资源——CPU、内存、磁盘IO都正常。你把存储过程中的SQL语句单独拎出来执行,发现跑得飞快。你尝试ALTER一下存储过程(什么代码都没改),问题竟然消失了。 ...

13 min · 6089 words

数据库死锁为何如此难以根除从检测算法到预防策略的五十年博弈

1971年,ACM Computing Surveys发表了一篇题为《System Deadlocks》的论文。作者Edward G. Coffman Jr.、M. J. Elphick和Arie Shoshani系统阐述了死锁发生的四个必要条件——互斥、持有并等待、非抢占、循环等待。这篇论文奠定了此后半个多世纪死锁研究的理论基础。然而,五十年过去了,死锁仍然是数据库系统中最常见的生产事故之一。2021年,北卡罗来纳州立大学的研究团队对106个数据库后端Web应用进行调研,收集了49个真实的死锁案例。研究发现,跨请求的数据库锁死锁不仅最常见,也是现有工具最难处理的类型。 ...

10 min · 4895 words

数据库连接池不是越大越好:为什么10个连接能击败100个

2013年,Oracle Real World Performance Group发布了一段令人震惊的视频。他们在压力测试中,将9600个并发线程的数据库连接池从2048降到96——不做任何其他优化,响应时间从100毫秒骤降到2毫秒。 ...

13 min · 6445 words

索引越多查询越慢?从写入放大到优化器误判的完整技术解析

一个开发者盯着慢查询日志,发现一条耗时3秒的SELECT语句。他熟练地添加了一个索引,查询时间降到50毫秒。第二天,他又用同样的方法解决了另一个慢查询。一个月后,这张表已经积累了12个索引。 ...

11 min · 5161 words

查询优化器的致命误判:为什么数据库有时会选错执行计划

2015年,慕尼黑工业大学的研究团队做了一个实验:他们把PostgreSQL查询优化器的基数估计值全部替换成真实值,然后观察113个复杂查询的执行时间变化。 ...

8 min · 3706 words

fsync()不是你想的那样:数据库持久化的致命误解

2018年3月,PostgreSQL开发者Craig Ringer在邮件列表中披露了一个令人震惊的发现:PostgreSQL对fsync()错误处理不当可能导致数据损坏。这个后来被称为"fsyncgate"的事件揭示了一个更深层的问题——许多开发者对fsync()的语义存在根本性误解。 ...

9 min · 4024 words

事务隔离级别为何成为数据库最被误解的概念

医院值班系统中,两位医生同时尝试放弃自己的值班班次。每个医生在操作前都会检查:是否至少还有另一位医生在值班?检查结果都显示"是",于是两人都放心地提交了更新。最终结果:当晚没有任何医生值班。 ...

10 min · 4538 words