Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 避免嵌套查询_Sql_Mysql_Sql Server - Fatal编程技术网

Sql 避免嵌套查询

Sql 避免嵌套查询,sql,mysql,sql-server,Sql,Mysql,Sql Server,避免嵌套查询有多重要 我总是学会像躲避瘟疫一样躲避它们。但它们对我来说是最自然的。在设计查询时,我编写的第一件事是嵌套查询。然后我将其转换为连接,这有时需要花费很多时间才能正确。而且很少有大的性能改进(有时会) 所以他们真的很糟糕。有没有一种方法可以在不使用临时表和文件排序的情况下使用嵌套查询?我不确定它在MySQL 5.1或5.5中是什么样子,但在5.0.x中,嵌套查询的性能通常很差,因为MySQL会对从主查询中获取的每一行执行子查询。 对于像MsSQL这样更成熟的数据库来说,情况可能不是这样

避免嵌套查询有多重要

我总是学会像躲避瘟疫一样躲避它们。但它们对我来说是最自然的。在设计查询时,我编写的第一件事是嵌套查询。然后我将其转换为连接,这有时需要花费很多时间才能正确。而且很少有大的性能改进(有时会)


所以他们真的很糟糕。有没有一种方法可以在不使用临时表和文件排序的情况下使用嵌套查询?我不确定它在MySQL 5.1或5.5中是什么样子,但在5.0.x中,嵌套查询的性能通常很差,因为MySQL会对从主查询中获取的每一行执行子查询。 对于像MsSQL这样更成熟的数据库来说,情况可能不是这样,它可以在内部将嵌套查询重写为联接,但我从未使用过MsSQL,所以我不确定

的确,在某些情况下,不仅可以在没有子查询的情况下重写查询,而且可以更有效地使用其中一些技术,而不是使用子查询。-这是一个相当有趣的说法,考虑到目前为止我所有的子查询都会进行数据库爬网


这要看情况而定,我曾经使用子查询改进过一些查询

我知道的因素有:

  • 子查询是否使用外部查询中的字段进行比较(或不使用)
  • 如果外部查询和子查询之间的关系被索引覆盖
  • 如果联接上没有可用的索引,并且子查询不相关并返回一个小结果,那么使用它可能会更快
  • 我还遇到过这样的情况:将使用ORDERBY的查询转换为不使用ORDERBY的查询,然后将其转换为简单的子查询和排序,从而提高mysql的性能
无论如何,测试不同的变体总是很好的(请使用SQL\u NO\u缓存),将相关查询转换为联接是一个很好的实践

我甚至认为这是一种非常有用的做法

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

编辑: 程序与关系的对比
从集合运算与过程的角度思考,可以归结为某些集合代数表达式中的等价性,例如,并集上的选择等价于选择的并集。两者之间没有区别。
但是,当您比较这两个过程时(例如,将选择条件应用于union的每个元素,创建union,然后应用选择),这两个过程明显不同,可能具有非常不同的属性(例如CPU、I/O、内存的利用率)

关系数据库背后的思想是,您不试图描述如何获得结果(过程),而只描述您想要的,数据库管理系统将决定满足您的请求的最佳路径(过程)。这就是调用SQL的原因

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

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

在您的例子中,这只是优先于相关查询,因此可能是我没有告诉您任何新的内容,但您强调了这一点,因此发表了评论

我认为,如果您完全熟悉将查询从一种形式转换为另一种形式的所有规则(例如分布性),那么您就不会喜欢相关子查询(您会认为所有形式都是相同的)


(注意:上面讨论了理论背景,这对数据库设计很重要;实际上,上述概念存在偏差-并非所有等价的查询重写都必须快速执行,群集主键确实会使表在磁盘上具有继承顺序等…但这些偏差仅是偏差;并非所有等价的查询都是xecute as fast是实际DBMS的一个缺陷,而不是其背后的概念)

就我个人而言,我倾向于避免嵌套查询,直到它们是必要的,因为嵌套查询会降低代码的可读性,并使调试和协作更加痛苦。我认为,如果嵌套查询很琐碎,或者临时存储大表成为问题,嵌套是可以接受的。但是太多了我曾多次在嵌套查询中看到复杂的嵌套查询,这会让调试非常痛苦。

我也想知道这一点。我怀疑这对性能有任何影响,至少在MS SQL Server中是这样。MySQL并没有那么聪明……你有“从集合操作的角度思考”和“从过程操作的角度思考”的例子吗@Midhat:在回答中进行了评论(编辑)。如果不是您想要的,很抱歉,您是否正在寻找更实用的示例或上述解释?链接到下面!可能: