连接查询比相应的嵌套查询花费更多的执行时间

时间:2009-11-30 12:53:38

标签: sql-server performance

我有2个表Person_OrganizationPerson_Organization_other,嵌套查询是:

SELECT 
    Person_Organization_id 
FROM 
    Person_Organization_other 
WHERE  
   company_name IN (SELECT company_name 
                    FROM Person_Organization_other
                    WHERE Person_Organization_id IN (SELECT Person_Organization_Id 
                                                     FROM Person_Organization 
                                                     WHERE person_id = 117 
                                                       AND delete_flag = 0)
                  )

以上查询的相应查询与我尝试的连接是: -

SELECT  
    poo.Person_Organization_id 
FROM 
    Person_Organization_other poo, Person_Organization_other poo1, Person_Organization po
WHERE
    poo1.Person_Organization_id = po.Person_Organization_Id 
    AND po.person_id = 117 
    AND po.delete_flag = 0 
    AND poo.company_name = poo1.company_name
GROUP BY 
    poo.Person_Organization_id

然而,与具有连接的相应查询相比,发现嵌套查询花费的时间更少。我使用SQL profiler跟踪来比较执行查询的时间。对于嵌套查询,它需要30多ms。对于连接查询,它需要41个奇数ms

我的印象是,通常嵌套查询的性能较差,应该使用连接“展平”。

有人可以解释我做错了吗?

问候 尼丁

4 个答案:

答案 0 :(得分:1)

您正在使用交叉联接。尝试内连接。

select poo.Person_Organization_id 
from Person_Organization po 
 INNER JOIN Person_Organization_other poo ON
  poo.Person_Organization_id=po.Person_Organization_Id
 INNER JOIN Person_Organization_other poo1 ON
  poo1.Person_Organization_id=po.Person_Organization_Id AND   
  poo.company_name=poo1.company_name
 where po.person_id=117 AND po.delete_flag=0 
 group by poo.Person_Organization_id

答案 1 :(得分:0)

通过用逗号分隔你的表,你实际上是十字架将它们连接在一起。我会尝试在表之间进行显式的INNER JOIN,看看是否有助于提高性能。

答案 2 :(得分:0)

嵌套查询性能较差且应该使用连接展平的观点是一个神话 - 不合适的嵌套子查询确实会导致性能问题,但在许多情况下使用子查询与使用连接一样好。

实际上,SQL服务器通过将它们减少到执行树来优化它执行的所有查询 - 通常使用JOIN的查询最终使用相同的执行树来代替使用嵌套查询的等效sql语句。

在这种情况下,这些的执行时间实际上是非常低的 - 差异可以很容易地解释为由于缓存等...没有被填充。

我的建议是使用任何对你更有意义的语法 - 如果你遇到性能问题,那么请回过头来检查嵌套子查询是否是导致问题的原因,但我绝对不会花时间担心“扁平化”不会导致问题的查询。

答案 3 :(得分:0)

您的表顺序可能会降低from table子句中的表顺序应该按行数递增的顺序