SQL子查询具有最佳性能

时间:2012-08-23 12:19:06

标签: sql performance subquery exists in-clause

我对这个SQL查询有疑问:

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

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

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

6 个答案:

答案 0 :(得分:2)

对于性能观点,请使用此查询

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

我建议改为加入

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

答案 3 :(得分:0)

您需要选择一个列,就像在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’        
        );

答案 4 :(得分:0)

您正在使用In,因此您只需要一个row来将其与名称进行比较。 在这种特殊情况下,您可以使用Join作为替代方案。 在MySQL中,subquery具有同等效力,但in SQL-Server In is more performant than Join。 所以,在这种情况下,你只需返回一行。

如果您在inner join中使用*,则可以使用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 ,但为了便于阅读,最好返回您将使用的字段。 这个例子将是

{{1}}

答案 5 :(得分:0)

你应该总是尽量避免使用*。更好的是永远不会使用*。

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