日期:2014-05-16  浏览次数:20367 次

SubQuery or Join?

很多开发都喜欢用Subquery而不喜欢用Join,对于他们来讲Subquery更容易实现。但是很多情况下用Join性能要比用Subquery好。

 

首先我们看一下Subquery: 子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

许多包含子查询的Transact-SQL 语句都可以改用联接表示。其他问题只能通过子查询提出。在 Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。

 

下面是改写Subquery的一个例子:

 

SELECT c.AccountNumber,

      (SELECT count(*)

            FROM Sales.SalesOrderHeader o

            WHERE c.CustomerID = o.CustomerID AND Year(OrderDate) = 2001) as Orders_2001,

      (SELECT count(*)

            FROM Sales.SalesOrderHeader o

            WHERE c.CustomerID = o.CustomerID AND Year(OrderDate) = 2002) as Orders_2002,

      (SELECT count(*)

            FROM Sales.SalesOrderHeader o

            WHERE c.CustomerID = o.CustomerID AND Year(OrderDate) = 2003) as Orders_2003,

      (SELECT count(*)

        &n