安东内拉鏖战迪马利亚 发表于 2023-9-14 12:08:43

一个大联接或多个查询哪个提供更好的性能?

我有一张叫订单的桌子。订单上的一列是customer_id,
我有一个名为“ customers”的表,具有10个字段
给定两个选项,如果我要建立一个订单对象数组并将其嵌入到一个客户对象中,那么我有两个选择。
选项1:
一种。首先查询订单表。b。遍历记录并查询人员表以获取人员的记录
这将是这样的:
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 . . .
选项2:
一种。在所有领域参加
#2是显而易见的,因为您只执行一个查询,而不是1 + 个查询(可能是数百个或更多)
就像这样:
Select * from Applications a, Customers c
Innerjoin c.id = a.customerID
我的主要问题是,如果我还有10个其他订单表之外的其他表(类似于客户),而您在订单表中有ID,该怎么办?您应该执行一个将这10个表联接起来的查询,还是在某种程度上这样做效率低下:
任何建议都将有所帮助..是否有任何优化来确保快速性能
               
解决方案:
               


                我同意每个人的观点,即即使有很多表,单联接也可能会更有效率。与在应用程序代码中完成工作相比,这也减少了开发工作量。假定表已正确索引,每个外键列上都有一个索引,并且(当然)每个主键列上都有一个索引。
最好的选择是首先尝试最简单的方法(大连接),然后查看其效果如何。如果运行良好,那就太好了-您已完成。如果执行不佳,请分析查询并查找表中缺少的索引。
由于网络往返次数(如anijhaw所述),您的选择#1不太可能执行良好。有时这称为“选择N + 1”问题-
您执行一个SELECT以获得N个应用程序的列表,然后循环执行N
SELECTs以获取客户。对于应用程序程序员来说,这种一次记录循环是很自然的。但是当您一次处理整个数据集时,SQL的效果要好得多。
如果即使索引良好,选项#2还是很慢,则您可能需要研究缓存。您可以在数据库中(使用摘要表或物化/索引视图),在应用程序中(如果有足够的RAM)或专用的缓存服务器(例如memcached)中进行缓存。当然,这取决于查询结果的最新程度。如果所有内容都必须是最新的,则每当底层表更新时,任何高速缓存都必须进行更新-
它变得复杂并且变得不太有用。
但是,这听起来像是报告查询,并且报告通常不需要实时。因此缓存可能可以为您提供帮助。
根据您的DBMS,要考虑的另一件事是此查询对命中同一数据库的其他查询的影响。如果您的DBMS允许读取器阻止编写器,则此查询可能需要很长时间才能运行,因此可能阻止对表的更新。那将是不好的。Oracle没有此问题,在“读取已提交的快照”模式下运行时,SQL
Server也没有。我不了解MySQL。
页: [1]
查看完整版本: 一个大联接或多个查询哪个提供更好的性能?