我们可以使用 IN 语句在多个查询中分解 SQL 连接吗
Posted
技术标签:
【中文标题】我们可以使用 IN 语句在多个查询中分解 SQL 连接吗【英文标题】:Can we decompose SQL joins in several queries using IN statement 【发布时间】:2013-01-18 21:50:03 【问题描述】:No`orm 的创建者表明可以将 3 个表的连接分解为 3 个更快的查询:http://www.notorm.com/#performance。
您认为可以通过将 ID 放在 IN 语句中来避免连接和使用多个查询吗?
由于上述原因,那个库(NoORM)不支持连接,你认为我可以放弃使用连接而只使用那个库吗?对我来说很奇怪避免加入是如此容易。
【问题讨论】:
没有一揽子答案。 “这取决于”是你会得到的最好的。触发 3 个单独的查询、解析/编译每个查询、从磁盘获取记录等的开销很可能比进行 3 路连接的开销更高(甚至更高)。找出哪个更好取决于您,因为您的用例不会与其他任何人的用例相同。 【参考方案1】:对于规模相对较小的应用,这是可行的。但是在您可能传递许多参数的情况下(相当于您在许多行上匹配的连接条件),这将使您失败。我能想到的最好的例子是 Informix 的一个限制,例如,(我不知道最新版本是否如此)准备好的语句不允许超过 20 个(不精确)左右的参数要通过了。
【讨论】:
我对其他数据库服务器没有太多经验,所以可能不存在这样的限制。但我认为值得指出的是,至少有些数据库服务器有这样的限制(除非你准备好接受不使用准备好的语句的风险)【参考方案2】:在单个查询上使用连接的一个原因是它允许数据库的优化器根据现有数据为所涉及的表提出最佳计划。如果您将一个联合查询分解为单独的查询,您实际上是在对执行计划进行硬编码。除其他外,这假设您在编写代码时将花一些时间考虑查询的选择性,并且在应用程序的生命周期内选择性将保持不变。在我看来,这些都是相当大的假设。
此外,如果您将数据库用作不只是一个愚蠢的容器,您可能会发现有些查询不会那么容易分解为单个查询(例如,几乎在您使用聚合函数的任何时候) .
【讨论】:
以上是关于我们可以使用 IN 语句在多个查询中分解 SQL 连接吗的主要内容,如果未能解决你的问题,请参考以下文章