连接查询是否比两次查询更快?

5
我知道这个问题之前已经被问过了,例如这个例子,我确实同意使用join的一个查询比每个记录返回另一个查询要快。
然而,由于使用join可能会生成冗余字段,这会减慢网络速度吗?
假设我有一个酒店表,HOTEL在表HOTEL_IMAGE中有许多图片。 HOTEL拥有20个字段。 在HOTEL_IMAGE上执行join将为每个酒店图像产生20个字段。 那么这个查询在网络上仍然更快吗?

7
回答:取悦 - 这要看情况 :). 你是指内连接还是外连接(外连接效率较低)?你使用的是哪种关系型数据库管理系统(RDBMS)?你在连接远程表吗?一般来说,连接会更快,但也有很多例外。最好的做法是针对你所面临的情况检查每个查询计划。 - David Neale
1
@David - 答案正确! - Martin Smith
1
连接操作不会自动产生20个“字段”,只要您选择您想要的列即可。 - user330315
1
@Jonny:那我就不明白问题了。如果确实需要这些列(并且有意选择它们),那么第二个语句也需要选择它们。那么问题到底是什么? - user330315
@horse 我确实需要它们,但只需要一次。使用连接,酒店数据将为酒店拥有的每个图像返回。 - Jonny
显示剩余3条评论
3个回答

2

这要看你的实际数据情况,但从我所见,如果你有一个参数良好、统计数据新鲜的数据库,最好将连接放在SQL中,让数据库自己处理。

无论如何,我认为DB查询是你想要进行性能分析的第一件事情。任何好的DBMS都有很多性能测量工具,这不是巧合。而且你需要使用尽可能接近实际数据的数据进行分析(最好是生产环境的最新副本)。


1

不要使用 select *,只选择你需要的列。如果这样做,联接(join)将会更快(不确定为什么您会想用两个查询来做这件事,因为您必须连接两个数据库等)


3
问题中没有提到 * - Martin Smith
我的只是一个例子。很难在不写整篇文章的情况下用文字解释清楚。 - Jonny
1
@Martin Smith: "将会产生20个字段"听起来非常像正在使用SELECT * - user330315
2
@a_horse_with_no_name - 问题的要点显然是,如果您在一个一对多的关系上进行连接,并且一侧的选定列列表具有大型(BLOB)列,那么复制这些列的开销是否会超过在一个查询中执行它的好处。没有理由得出他们使用 * 的结论。他们的应用程序可能需要这些数据。 - Martin Smith

0
作为避免连接数据中重复的解决方案,如果您的数据库支持,可以从单个查询返回多个记录集。一个记录集将返回主记录,第二个记录集将返回详细记录以及主查询的关键字段。
select ID, Name, ...  from HOTEL where <.... your criteria>;

select h.ID as HotelID, i.ID, i.Description, i.ImageFile, .... from HOTEL_IMAGE i 
join HOTEL h on h.ID = i.HotelID and ( <.... same criteria for HOTEL> )

不确定主表上的查询是否会被缓存,因此第二个选择将重用它,但肯定会节省流量。

我们正在使用这种方法来查询那些倾向于返回多级联结果的查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接