Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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_Database_Database Design_Query Optimization - Fatal编程技术网

Sql 在一个大连接或多个查询中,哪一个提供了更好的性能?

Sql 在一个大连接或多个查询中,哪一个提供了更好的性能?,sql,database,database-design,query-optimization,Sql,Database,Database Design,Query Optimization,我有一张叫“订单”的桌子。订单上的一列是客户id 我有一个名为customers的表,有10个字段 给定这两个选项,如果我想要构建一个订单对象数组,并且在订单对象中嵌入的是一个客户对象,那么我有两个选择 备选案文1: a。首先查询订单表。 B循环浏览记录并查询persons表以获取该人员的记录 这将类似于: Select * from APplications Select * from Customer where id = 1 Select * from Customer where

我有一张叫“订单”的桌子。订单上的一列是客户id
我有一个名为customers的表,有10个字段

给定这两个选项,如果我想要构建一个订单对象数组,并且在订单对象中嵌入的是一个客户对象,那么我有两个选择

备选案文1: a。首先查询订单表。 B循环浏览记录并查询persons表以获取该人员的记录

这将类似于:

 Select * from APplications

 Select * from Customer where id = 1
 Select * from Customer where id = 2
 Select * from Customer where id = 3
 Select * from Customer where id = etc . . .
 Select * from Applications a, Customers c
 Innerjoin c.id = a.customerID
备选案文2: a。在所有字段上进行联接

这是一个明显的#2,因为您只执行一个查询,而不是1+[numberOforders]查询(可能是数百个或更多)

这将类似于:

 Select * from APplications

 Select * from Customer where id = 1
 Select * from Customer where id = 2
 Select * from Customer where id = 3
 Select * from Customer where id = etc . . .
 Select * from Applications a, Customers c
 Innerjoin c.id = a.customerID
我的主要问题是,如果我有10个其他的表,它们都在订单表之外(类似于customer),而您在订单表中有id,该怎么办。您应该执行一个连接这10个表的查询,还是在某个时候执行以下操作:


任何建议都会有帮助。。是否有任何优化来确保快速性能

在我看来,单个连接仍然会更快,因为DBMS总是在执行连接之前执行where子句。这意味着在合并和连接发生之前,所有涉及的表都已缩减到可能的最小大小

事实上,为了得到你想要的东西,你必须在某个时间点从所有这些表格中读取。。。所以,只要做一次,我的工作效率就会大大提高


这里的关键是表在连接之前都被缩减到最小大小,并且我们使用内部连接。如果这两个条件都发生了变化(一些外部联接是可以的),那么您可能会遇到问题

如果这个customer\u id在您的customer表中是唯一的(而其他id在其他表中是唯一的),那么您的查询在每个应用程序中只返回1行,那么执行单个SELECT肯定更有效

在一个查询中加入所有必需的客户将得到优化,而使用大量的单选则无法

编辑
我用Oracle PL/SQL和50000个应用程序以及50000个匹配的客户尝试了这一点

在一个查询中选择所有内容的解决方案耗时
0.172秒

在一次选择中选择每个客户的解决方案
1.984 s

在其他客户端或通过网络访问时,情况很可能变得更糟

您是应该执行一个连接这10个表的查询,还是在某个时候效率低下

所有这些表都连接到订单-返回的所有记录都是相关的。在尽可能少的查询或操作中获取所有相关内容并不是低效的


使用单独的查询时,数据可能在两次查询之间发生更改的风险会增加。

由于两个主要原因,单次连接应该更快

如果您是通过网络进行查询,那么使用多个查询而不是单个查询会产生开销


连接将使用查询优化器在DBMS内部进行优化,因此比执行多个查询更快。

我同意所有人的说法,即使有很多表,单个连接也可能更有效。与在应用程序代码中进行工作相比,它的开发工作量也更少。这假设表被适当地索引,每个外键列上都有一个索引,当然,每个主键列上都有一个索引

您最好先尝试最简单的方法(大连接),看看它的性能如何。如果它表现得很好,那就太好了——你完成了。如果查询性能不佳,请分析查询并查找表中缺少的索引

由于网络往返次数(如anijhaw所述),您的选项1不太可能表现良好。这有时被称为“选择N+1”问题——您只需进行一次选择即可获得N个应用程序的列表,然后在循环中进行N次选择即可获得客户。这种每次记录的循环对于应用程序程序员来说是很自然的;但是,当您同时对整个数据集进行操作时,SQL工作得更好

如果选项#2即使索引良好,速度也很慢,那么您可能需要研究缓存。您可以缓存在数据库(使用摘要表或物化/索引视图)、应用程序(如果有足够的RAM)或专用缓存服务器(如memcached)中。当然,这取决于查询结果的最新程度。如果所有内容都必须是完全最新的,那么任何缓存都必须在底层表更新时进行更新——这会变得复杂,变得不那么有用

不过,这听起来像是一个报告查询,报告通常不需要是实时的。所以缓存可能会对您有所帮助


根据您的DBMS,需要考虑的另一件事是此查询对命中同一数据库的其他查询的影响。如果您的DBMS允许读卡器阻止写入器,那么如果查询需要很长时间才能运行,则该查询可能会阻止对表的更新。那太糟糕了。Oracle没有这个问题,SQL Server在“读取提交的快照”模式下运行时也没有。但是我不知道MySQL。

我更新了这个问题,让它更清楚一些。这不会返回一行。但不是每个应用程序一行吗?应用程序是模式中最“详细”的实体吗?或者(例如)您是否有一个每个应用程序都有多行的ApplicationItems表?我更新了问题以使其更清楚。如果我在我的帖子里不清楚的话,我就不会有任何地方出问题。我的意思是,它会在每个应用程序中返回一行,对吗?这里的大多数答案都非常模糊,这些答案都是由那些甚至没有在SQL中处理大数据的新手给出的。(是的,用SQL处理大数据是愚蠢的,但有时你别无选择)我运行了一个基准测试,并将结果发布到。我本想在这里添加一个答案,但是,对多个问题发布相同的答案是。请注意#1和#2