Sql JoiN和性能

问题描述:

我有一个关于JOINS的问题。 Sql JOIN是否会降低查询的性能? 我有许多JOIN查询。我可以说,糟糕的表现是来自这些JOINS?如果是的话,我应该怎么做而不是JOIN查询?Sql JoiN和性能

这里是我的一块查询

...... 
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=tb_bauteile.[FC_Plus]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus ON Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung ON Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl ON Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl] 
WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id])); 
+1

见:http://stackoverflow.com/questions/1200295/sql-join-vs-in-performance,只有这样才能得到一个明确的答案为您的特定测试是措施 –

+0

还...请更好地格式化您的查询,水平滚动是不可能的 –

显然需要处理连接,并且此处理将消耗CPU,内存和IO。

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

但是,使用正确支持索引的SQL连接会产生比其他方法更快的结果。

只要考虑你需要做什么来计算与上面的SQL相同的结果。读取第一个表格,然后按照正确的顺序排序,然后读取第二个表格并对其进行排序,然后合并两个结果集,然后继续执行第三个表格...... 或读取第一个表格中的所有行,并读取为每行发出SQL以检索匹配的行。

SQL连接完全不降低性能:恰恰相反:他们往往会成倍加快查询,假设offcousre垫层数据库模型很好的落实。索引在这件事上非常重要。

是的,它确实..增加表间记录和联接的数量会增加执行时间..左/右联接绝对不会比INNER JOIN更快。 INDEXING在表的右列将提高查询性能。

如果你的查询有太多的连接并且它的执行频率很高,你可以选择创建SQL VIEW或Materialized 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];