原文地址:http://ronaldbradford.com/blog/select-1-2022-04-01/
如果您使用 RDBMS 一段时间,您可能会遇到过这样的声明SELECT 1。
然而,很少有人正确地向工程师解释 SELECT 1 的起源是什么,为什么它是无用和浪费的?谷歌搜索不会给您希望的响应,这些排名响应与声明本身一样无用。
膨胀
看到 aSELECT 1证实了两件事。首先,您使用的是通用 ORM 框架quote,其次,您从未优化过 SQL 流量模式。
“框架通常很糟糕。
他们声称提高开发速度并抽象出对 SQL 的了解。
现实是次优性能的未记录成本,尤其是在数据持久性方面。”
连接池
SELECT 1来自连接池的早期实现。
什么是连接池?每次您想要返回一些数据时,不是一个新的请求或调用获取一个新的数据库连接,而是编程语言实现了一个带有预先建立的数据库连接的预加载池的缓存。如果您从简单的 SELECT 语句中检索数据,预期目标是减少获取新数据库连接的初始昂贵操作的执行时间。如果足够智能(很多不是),这些池将包括诸如低水位、高水位、空闲连接的修剪退避和刷新所有连接的能力等功能。
当您的代码想要访问数据库以检索数据时,它会首先向连接池询问其池中的可用连接,将该连接标记为正在使用并提供该连接以供后续使用。
以下是检索一条信息实际上需要的两个查询的简单示例。
SELECT 1 SELECT email_address, phone, position, active FROM employee where employee_id = ?
陈旧
SELECT 1被实现为最轻量级的 SQL 语句(即,最少的解析、权限检查、执行),它将验证您的连接是否仍然处于活动状态和可用状态。如果SELECT 1失败,即跨网络的协议通信,连接可能会从连接池中删除,并且可能会请求池中的新连接。虽然这可能看起来无害,但它会导致多个代码效率低下,这是后续讨论的主题。
错误处理失败
SELECT 1是执行错误处理的一种懒惰且有缺陷的方法。实际上,每条 SQL 语句都需要足够的错误处理,任何语句都可能在任何时候无法完成。在前面的示例中,如果SELECT 1成功但简单的索引 SELECT 语句失败会发生什么?这种反模式通常还表明错误处理不一致且高度重复,而不是在数据访问路径中的正确位置。
根据定义,所有 SQL 语句的抽象函数都需要错误处理,它需要处理所有类型的错误处理,包括连接不再有效、连接终止、超时等。
如果您有正确的错误处理SELECT 1,那么将是多余的,正如我所说的那样无用。您只需运行实际的 SELECT 语句并相应地处理任何故障。
高可用性
在当今的云优先架构中,高可用性由多个可用区和多个区域组成,应用程序 A 可以与数据库 B 进行通信,在经过良好调整的系统中每次不需要的网络往返都是浪费的,也就是说,它会花费你时间来渲染一个结果更快。我们都知道研究表明,缓慢的页面加载会使用户远离您的网站。
云的成本
这个由 Matt Adorjan 编写的AWS 延迟监控网格真正向您展示了当应用程序 A 和数据库 B 在地理上分开并且您只需要一条信息时物理对您的弹性测试策略的影响。
结论
SELECT 1的持续出现是对性能优化是失去效率能力的大量工程代码编写人员所缺少的技能的强化。这也是另一个轻松的胜利,它成为数据架构师为确保您的组织提供更好的客户体验而进行的不必要的战斗。




