【问题标题】:What is the efficiency of a query + subquery that finds the minimum parameter of a table in SQL?SQL中查找表的最小参数的查询+子查询效率如何?
【发布时间】:2022-01-25 00:27:20
【问题描述】:

我目前正在学习 SQL 课程并尝试了解查询的效率。

给定这个查询,它的效率如何:

SELECT *
FROM Customers
WHERE Age = (SELECT MIN(Age)
             FROM Customers)

我想了解的是,如果子查询在开始时运行一次,然后查询是 O(n+n)? 还是每次您经历客户的年龄时都会运行子查询,这使得它成为 O(n^2)? 谢谢!

【问题讨论】:

  • SQL 是声明性的,您只需告诉 什么 您想要 而不是 如何获得它。 DBMS 会自己想办法获取它。 DBMS 发现,这样一来,取决于很多事情,甚至可能会根据表中当前的实际数据而有所不同。所以你的问题没有答案。您需要查看 DBMS 为查询生成的执行计划并获得 其 运行时间复杂度。但正如我所说,这不是查询的复杂性。
  • 好的,非常感谢!
  • @stickybit 有没有机会我可以私下联系你,询问与此相关的其他问题?
  • 不,没有。

标签: sql performance


【解决方案1】:

如果您想了解查询优化器如何解释查询,您必须查看几乎每个 RDBMS 都提供的执行/解释计划。

如 cmets 中所述,您告诉 RDBMS 您想要什么,而不是如何获得它。

通常有助于更深入地了解正在使用的特定数据库引擎,以便以最高性能的方式编写查询,即能够像查询处理器一样思考。

与任何语言一样,可以这么说,给猫剥皮的方法不止一种,而对于 SQL,通常有不止一种方法可以编写产生相同输出的查询 - 通常有多种方法,具体取决于复杂性。

如何构建和执行查询执行计划由查询优化器在编译时确定,并取决于许多因素,具体取决于 RDBMS,例如数据基数、表大小、行大小、估计行数、可搜索性、索引、可用资源、当前负载、并发性、隔离级别 - 仅举几例。

通过思考您必须做什么来完成相同的任务,通常有助于以最高效的方式编写查询。

在您的示例中,您正在查找表中特定值等于另一个值的所有行。您选择通过首先查找最小年龄来找到该值 - 您只需执行一次,因为它是单个标量值,因此假设(但不保证)数据库引擎会这样做是合理的。

如果 RDBMS 支持语法,您还可以通过聚合和限制到符合条件的顶部行并包括平局来解决问题,然后加入结果。

最终没有非黑即白的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多