【问题标题】:Sql JoiN and PerformanceSql 连接和性能
【发布时间】:2012-05-23 06:46:01
【问题描述】:

我有一个关于 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=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]));

【问题讨论】:

标签: sql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    显然需要处理好连接,这个处理会消耗cpu、内存和IO。

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

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

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

    【讨论】:

      【解决方案3】:

      联接肯定会降低您将要执行的 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];
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-02-12
          • 2017-08-13
          • 1970-01-01
          • 1970-01-01
          • 2012-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多