五年前的一个下午,他写下了一行自己至今忘不掉的SQL。窗外是雨是晴,他记不清了,但那行查询语句,他一个字都没忘。
![]()
当时他的日常任务之一,是在一个存储过程里写查询。表叫 dbo.HugeTableWithoutIndexes,名字已经把问题说得很直白:几百万条记录,一个索引都没有。他写下的条件是 DATEDIFF(DAY, ADateColumn, @InputDate) = 0,把列包进函数里做比较。
他自己后来给这个写法下了定义:致命错误。列被函数包住之后,索引就算存在也用不上,查询只能对整张表做全表扫描。几百万行数据被从头翻到尾,服务器随即"着火"——他补了一句,当然不是字面意义上的着火。
这套系统是给一个基于 Amazon SES 搭建的邮件系统用的,要展示邮件的全部活动状态:已送达、已打开、已退信等等。功能本身不复杂,复杂的是它背后的数据量。
更值得说的是他当时的态度。那几年他拒绝学SQL,认定ORM和NoSQL已经够用。他后来的原话是:大错特错。关系型数据库和SQL至今仍然统治着这个领域。
转折点是他终于去学了索引、扫描与查找的区别,以及SQL Server的内部机制。他特别提到了 Brent Ozar 的课程。这个教训他称之为"永远不会忘的痛",结尾还留了句玩笑:记得吃维生素、多锻炼、用索引。
他给出的结论很硬:你逃不开SQL。这也是他把SQL写进自己教程 Street-Smart Coding 的原因之一——他说那是他在成为高级程序员的路上,希望当年就有人递给他的那份指南。
这行代码的可怕之处不在于它多难写,恰恰在于它太容易写。一个看起来完全合理的日期比较,一个没有索引的表,一次全表扫描,就足够让服务停摆。写它的人当时并不觉得自己在冒险。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.