Sql 连接和性能

问题描述 投票:0回答:4

我有一个关于 JOINS 的问题。 Sql JOIN 是否会降低查询性能? 我有很多 JOIN 的查询。我可以说糟糕的性能来自于这些 JOINS 吗?如果是,我应该做什么而不是在查询中加入?

这是我的一段查询

...
FROM (((((tb_Pinnummern 
INNER JOIN tb_Fahrzeug 
    ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG) 
INNER JOIN tb_bauteile 
    ON tb_Pinnummern.Bauteil = tb_bauteile.ID) 
LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus 
    ON Fehlercodes_akt_Liste_FC_Plus.ID = b_bauteile.[FC_Plus]) 
LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus 
    ON Fehlercodes_akt_Liste_FC_Minus.ID = b_bauteile.[FC_Minus]) 
LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung 
    ON Fehlercodes_akt_Liste_FC_Unterbrechung.ID = b_bauteile.[FC_Unterbrechung]) 
LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl 
    ON Fehlercodes_akt_Liste_FC_Aderschl.ID = b_bauteile.[FC_Aderschl]
    WHERE (((tb_Fahrzeug.ID) = [forms]![frm_fahrzeug]![id]));
sql
4个回答
2
投票

Well joins 显然需要处理,这个处理会消耗 cpu、内存和 IO。

除此之外,我们还必须考虑到,如果没有正确的索引等,连接的性能可能会非常非常糟糕。

但是,具有正确支持索引的 SQL 连接将比任何其他方法更快地生成您需要的结果。

只需考虑一下您需要做什么才能计算出与上面的 SQL 相同的结果。读取第一个表,然后按正确的顺序排序,然后读取第二个表并排序,然后合并两个结果集,然后再继续第三个表…… 或者读取第一个表中的所有行,然后对于每一行发出 SQL 来检索匹配的行。


2
投票

是的。增加表之间的记录和连接数量会增加执行时间。LEFT/RIGHT JOIN 绝对不会比 INNER JOIN 快。在表的右列上建立索引将提高查询性能。

如果您的查询中有太多联接并且其执行频率很高,请采取替代方案,即创建 SQL VIEW 或物化视图(物化视图 - 如果您使用的是 Oracle)。


0
投票

连接肯定会降低您将要执行的 SQL 查询的性能。 您应该为您编写的 SQL 生成 SQL 计划,并研究降低 SQL 成本的方法。任何查询分析工具都应该可以帮助您。

根据我在上面定义的查询中的理解,您试图从内部联接中的表中获取所有行,并从左联接中的表中获取特定列(如果存在)。

既然如此,以下面给定格式编写的查询应该会有所帮助:

select (select Fehlercodes_akt_Liste_FC_Plus.column1 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus where Fehlercodes_akt_Liste_FC_Plus.ID=tb_bauteile.[FC_Plus]),
    (select Fehlercodes_akt_Liste_FC_Minus.column2 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus where Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]),
    (select Fehlercodes_akt_Liste_FC_Unterbrechung.column3 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung where Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]),
    (select Fehlercodes_akt_Liste_FC_Aderschl.column4 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl where Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl]),
    <other columns>
FROM
(tb_Pinnummern INNER JOIN tb_Fahrzeug ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG)
INNER JOIN tb_bauteile ON tb_Pinnummern.Bauteil = tb_bauteile.ID) as <aliastablename>

WHERE <aliastablename>.ID=[forms]![frm_fahrzeug]![id];

-1
投票

Sql Join 根本不会降低性能:相反:如果底层数据库模型得到很好的实现,它们通常会成倍地加快查询速度。索引在这件事上非常重要。

© www.soinside.com 2019 - 2024. All rights reserved.