我有一个关于 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]));
Well joins 显然需要处理,这个处理会消耗 cpu、内存和 IO。
除此之外,我们还必须考虑到,如果没有正确的索引等,连接的性能可能会非常非常糟糕。
但是,具有正确支持索引的 SQL 连接将比任何其他方法更快地生成您需要的结果。
只需考虑一下您需要做什么才能计算出与上面的 SQL 相同的结果。读取第一个表,然后按正确的顺序排序,然后读取第二个表并排序,然后合并两个结果集,然后再继续第三个表…… 或者读取第一个表中的所有行,然后对于每一行发出 SQL 来检索匹配的行。
是的。增加表之间的记录和连接数量会增加执行时间。LEFT/RIGHT JOIN 绝对不会比 INNER JOIN 快。在表的右列上建立索引将提高查询性能。
如果您的查询中有太多联接并且其执行频率很高,请采取替代方案,即创建 SQL VIEW 或物化视图(物化视图 - 如果您使用的是 Oracle)。
连接肯定会降低您将要执行的 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];
Sql Join 根本不会降低性能:相反:如果底层数据库模型得到很好的实现,它们通常会成倍地加快查询速度。索引在这件事上非常重要。