【问题标题】:SQL subqueries what has the best performanceSQL 子查询什么性能最好
【发布时间】:2012-08-18 22:58:51
【问题描述】:

我对此 SQL 查询有疑问:

 SELECT class
 FROM Ships
 WHERE name IN (SELECT ship
                FROM Outcomes
                WHERE result = ’sunk’);

我可以写在子查询SELECT * From Outcomes 还是我总是需要selectrow

那么什么查询的性能最好呢?

【问题讨论】:

    标签: sql performance subquery exists in-clause


    【解决方案1】:

    从性能的角度来看,请使用此查询

     select class 
     FROM Ships 
     join outcomes on ships.name=outcomes.ship
     and result like 'sunk'
    

    【讨论】:

    • 如果他使用 SQL-Server,这可能会降低性能。在 MySQL 中是一样的
    【解决方案2】:

    您不能将 * 放在这个子查询中。最好的方法是:

    SELECT class
      FROM Ships s
     WHERE exists
         (
            select 1 
              from Outcomes o
            where s.name = o.ship
              and result = ’sunk’
           )
    

    【讨论】:

      【解决方案3】:

      在这种情况下,您需要说明您选择的列。

      我会推荐加入

       seLECT class 
       FROM Ships 
           inner join outcomes
           on ships.name=outcomes.ship
          WHERE result = ’sunk’
      

      【讨论】:

        【解决方案4】:

        您使用的是In,因此您只需要一个row 即可将其与名称进行比较。 在这种特殊情况下,您可以使用 Join 作为替代方案。 在MySQL 中性能相同,但in SQL-Server In is more performant than Join。 因此,在这种情况下,您只需要返回一行。

        如果您在inner join 中使用subquery,则可以使用*,但为了便于阅读,最好返回您将使用的字段。 这个例子,将是

        select (fields..)
        from yourTable
        inner join (select fields from yourTable2) T2 on ConditionOfJoining
        
        select (fields..)
        from yourTable
        inner join (select * from yourTable2) T2 on ConditionOfJoining
        

        【讨论】:

          【解决方案5】:

          您应该始终尽量避免使用 *.最好不要使用 *。

          但在您的查询中,您必须说明该列。

          【讨论】:

          • 我同意下面的 Asif select class FROM Ships join results on ship.name=outcomes.ship 和结果如“沉没” 但是当你的数据库设计中有一个外键时,你的“结果”表链接到您的“船舶”表的 id,而不是使用名称。 (使用更少的存储空间,并防止拼写错误)SELECT class FROM Ships INNER JOIN results ON ship.Id = results.shipId and result = 'sunk'
          【解决方案6】:

          您需要选择一个列,就像您在 SQL 示例中所做的那样。

          还值得注意的是,通配符 * 不利于性能,因为服务器将需要做一些额外的工作来确定所有列是什么,正如您没有明确说明的那样。

          如果您想在IN 中包含多个要比较的列,那么我建议您在子查询中使用UNION

          SELECT class
               FROM Ships
               WHERE name IN
                 (SELECT ship
                  FROM Outcomes
                  WHERE result = ’sunk’
                  UNION
                  SELECT secondColumn
                  FROM Outcomes
                  WHERE result = ’sunk’        
                  );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-02
            • 1970-01-01
            • 2011-04-20
            • 1970-01-01
            • 2010-10-08
            • 2019-11-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多