当前位置: 首页 > 面试题库 >

避免嵌套查询

甄永年
2023-03-14
问题内容

避免嵌套查询有多重要。

我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高)

他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询


问题答案:

这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。

我知道的因素有:

  • 子查询是否使用外部查询中的字段进行比较(是否相关)
  • 如果外部查询和子查询之间的关系被索引覆盖
  • 如果联接上没有可用的索引,并且子查询没有关联并返回较小的结果,则使用它可能会更快
  • 我也遇到过这样的情况,其中将使用order by的查询转换为不使用它的查询,而不是将其转换为简单的子查询并进行排序,从而提高了mysql的性能。

无论如何,测试不同的变体(请使用SQL_NO_CACHE)总是好的,将相关查询转换为联接是一个好习惯。

我什至会称其为非常有用的做法。

如果您首先想到了相关查询,则可能不是您主要考虑集合操作,而是考虑过程操作以及处理关系数据库时,完全采用集合是非常有用的数据模型的透视图以及对其的转换。

编辑: 就集合运算与过程而言, 过程与关系
思考归结为某些集合代数表达式中的等价关系,例如,在并集上的选择等同于选择的并集。两者之间没有区别。
但是,当您比较这两个过程时,例如将选择标准应用到具有make
union的并集的每个元素上,然后应用选择,则这两个过程是截然不同的过程,它们可能具有非常不同的属性(例如,CPU利用率,I / O,内存)。


关系数据库背后的思想是,您不会尝试描述如何获得结果(过程),而只是描述您想要的结果,并且数据库管理系统将决定满足您请求的最佳路径(过程)。这就是为什么SQL被称为第四代语言(4GL)的原因。

可以帮助您做到这一点的技巧之一是提醒自己,元组没有固有的顺序(集合元素是无序的)。另一个人意识到关系代数非常全面,并且可以将请求(要求)直接转换为SQL(如果模型的语义很好地表示了问题空间,或者换句话说,如果表和关系的名称附带的含义正确完成)
,换句话说,如果您的数据库设计合理)。

因此,您不必思考如何,只需思考什么。

在您的情况下,它只不过是优先于相关查询,因此可能是我没有告诉您任何新内容,但您强调了这一点,因此发表了评论。

我认为,如果您完全满意将查询从一种形式转换为另一种形式的所有规则(诸如分布性之类的规则),则您将不希望使用关联子查询(所有形式都相等)。

(注意:上面讨论了理论背景,对于数据库设计很重要;实际上上述概念有所不同-
并非所有等效的查询重写都必须以快速执行,因为集群主键确实会使表在磁盘上具有继承顺序,依此类推…但是这些偏差只是偏差;并非所有等效查询都执行得这么快的事实是实际DBMS的缺陷,而不是其背后的概念)



 类似资料:
  • 在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF

  • 想象一下我有一个阶级家庭。它包含一个人员列表。每个(班级)人都有一个(班级)地址。每个(类)地址都包含一个(类)邮政编码。任何“中间”类都可以为空。 那么,有没有一种简单的方法可以在不必在每一步都检查null的情况下访问PostalCode?i、 例如,有没有办法避免以下菊花链代码?我知道没有“原生”Java解决方案,但我希望如果有人知道某个库或其他东西。(已选中Commons 不,不能改变结构。

  • 我想知道是否有可能在Java中“避免”空检查,以下面的代码为例: 它必须检查4次,否则代码将失败。 是否可以将语句转换为只有在没有NullPointerException时才执行的一行式语句?当出现异常时,该行应该被忽略。 这里我不是在谈论一个通用的语言特性,我是在谈论一个只有当您明确决定这样做时才会上交的特性。 例如:将是建议代码的一个片段。 在Java可能发生这样的事情吗? 如果不可能的话,在

  • 问题内容: 我需要确保许多并发用户能够访问数据库。虽然在每次提交后我都关闭了会话,但是有时我的代码遇到以下错误,但是当我几次执行相同的操作时,它会超过错误并可以正常工作。 我的hibernate状态是4.2.1。 我的密码 HibernateUtil 组态 问题答案: 在您的“我的代码”代码段中,可能存在一些问题: 发生异常时,没有阻止关闭会话的块 您正在打电话,但这与有所不同。因此,不会清除。

  • 问题内容: 我想制作一个页面来显示数据库中的一些数据,因此我创建了一些函数来从数据库中获取数据。我只是Node.js的新手,据我了解,如果我想在一个页面中使用所有这些内容(HTTP响应),则必须将它们全部嵌套: 如果有很多类似的功能,那么 嵌套就会成为问题 。 有办法避免这种情况吗?我想这与如何组合多个异步函数有关,这似乎是基本的东西。 问题答案: 有趣的观察。请注意,在JavaScript中,您

  • 问题内容: 我需要在功能中锁定两个对象,当前代码看起来像这样; 如您所见,如果另一个线程使用obj1和两个相反的代码运行这段代码,则这是死锁的简单明了的配方。 有没有一种方法可以使用concurrency-utils锁来避免这种情况? 我当时正在考虑维护一个对象及其锁的地图,并验证它们是否可供使用,但是似乎无法提出一种可以预测锁顺序的干净方法。 问题答案: 尽管您保留了锁定顺序,但是如果将obj1