Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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_Performance_Networking - Fatal编程技术网

Sql 连接是否比两个查询快

Sql 连接是否比两个查询快,sql,performance,networking,Sql,Performance,Networking,我知道以前有人问过这个问题, ,并且我确实同意一个带有联接的查询比对第一个查询返回的每个记录执行另一个查询要快 然而,由于连接会产生冗余字段,这会减慢网络速度吗 假设我有一个桌上旅馆,旅馆在桌上旅馆图片中有许多图片。这家旅馆有20块地。在HOTEL_映像上执行联接将为每个HOTEL映像生成20个字段。此查询在网络上还会更快吗?不要使用select*而只使用您需要的列。如果执行此操作,则联接将更快(不确定为什么要使用2个查询执行此操作,您必须与数据库建立2个连接等)。作为避免联接数据重复的解决方案

我知道以前有人问过这个问题, ,并且我确实同意一个带有联接的查询比对第一个查询返回的每个记录执行另一个查询要快

然而,由于连接会产生冗余字段,这会减慢网络速度吗


假设我有一个桌上旅馆,旅馆在桌上旅馆图片中有许多图片。这家旅馆有20块地。在HOTEL_映像上执行联接将为每个HOTEL映像生成20个字段。此查询在网络上还会更快吗?

不要使用select*而只使用您需要的列。如果执行此操作,则联接将更快(不确定为什么要使用2个查询执行此操作,您必须与数据库建立2个连接等)。

作为避免联接数据重复的解决方案,如果数据库支持,您可以从单个查询返回多个记录集。一个记录集将返回主记录,第二个记录集将返回详细记录以及主查询中的关键字段

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> )
选择ID、名称。。。从哪里来的酒店;
选择h.ID作为HotelID、i.ID、i.Description、i.ImageFile等。。。。来自图片一酒店
在h.ID=i.HotelID和()
不确定主表上的查询是否会被缓存,因此第二次选择将重用它,但它肯定会节省流量


我们在查询中使用这种方法,它倾向于返回多级联接结果。

这在很大程度上取决于实际数据,但从我所看到的情况来看,如果您有一个具有新统计信息的参数化良好的数据库,最好将联接放在SQL中,让数据库知道该做什么


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

Cop out-视情况而定:)。你是说内部联接还是外部联接(外部联接的效率要低得多)?您正在使用什么RDBMS?你要加入远程台吗?一般来说,联接会更快,但有许多例外。最好的办法是为你所处的每一种情况检查查询计划。@David-不过答案是正确的!内部联接和MYSql虽然我通常使用MS SQL Server,但只要您只选择所需的列,联接不会自动生成20个“字段”。@Jonny:那么我不明白这个问题。如果确实需要这些列(并有意选择它们),则还需要第二条语句来选择它们。那么问题到底是什么呢?这个问题没有提到我的只是一个例子。如果不写一个整体,很难用书面形式解释essay@Martin史密斯:“将产生20个字段”听起来很像是在使用
SELECT*
。@一个没有名字的马-问题的要点是,如果你在一对多关系上进行连接,并且一侧的所选列列表有大的(BLOB)在一个查询中复制这些列的开销将超过这样做的好处。没有理由断定他们正在使用
*
。他们的应用程序可能需要这些数据。