直接查询或子查询之间的区别?

时间:2013-03-06 00:32:52

标签: sql sql-server tsql

我遇到了一个存储过程,它有一些错误。一个是,开发人员这样做了:

SELECT alias.firstname, alias.surname, alias.id
FROM
    (SELECT firstname, surname, id, address, anotherfield, etc, etc
     FROM TableName
     WHERE afield = avalue) alias

所以,这显然与:

相同
SELECT firstname, surname, id
     FROM TableName
     WHERE afield = avalue

重复了很多次。所以,我的问题是,通过执行子查询会导致性能下降吗?我知道它没用......最好的想法就是把它弄好 - 我做了。但是,离开它会有任何性能损失吗?

我猜测查询优化器会理解它,做正确的事情?

3 个答案:

答案 0 :(得分:2)

如果外部查询中只涉及projection,则两个查询之间的执行计划应该完全没有区别。在内部和外部查询上使用“where”子句的更复杂查询可能会测试查询优化器的限制,并且可能会为两级查询生成较差的查询计划,但在您的情况下,计划和执行速度应该是相同。

答案 1 :(得分:2)

在这种简单的情况下,SQL Server会将这些查询折叠到同一个执行计划中。

我在AdventureWorks2012上试过这个:

SELECT CarrierTrackingNumber, ProductID, UnitPrice, LineTotal
FROM 
(
  SELECT *
    FROM Sales.SalesOrderDetail
    WHERE ProductID = 781
) AS Alias;

SELECT CarrierTrackingNumber, ProductID, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
     WHERE ProductID = 781;

计划完全相同,运行时指标的差异无法区分。

enter image description here

我还尝试了以下方法,故意选择具有复杂类型的表格(地理位置):

 SELECT AddressLine1, City, StateProvinceID 
 FROM Person.Address
   WHERE StateProvinceID = 9;

 SELECT AddressLine1, City, StateProvinceID 
 FROM 
 (
   SELECT * FROM Person.Address
   WHERE StateProvinceID = 9
 ) AS x;

 SELECT AddressLine1, City, StateProvinceID 
 FROM 
 (
   SELECT * FROM Person.Address
 ) AS x
 WHERE StateProvinceID = 9;

同样,在每种情况下,优化器都会折叠到索引扫描并忽略似乎被引用的其他列:

enter image description here

我是否可以依赖相同的优化来处理更复杂的查询,我不确定。优化器并不总是完美的或可预测的...所以我当然可以设想更多涉及的查询,这种崩溃不会可靠地发生。

我不确定我是否了解您所看到的模式的价值。也许那里有一些实际上有用的例子。

答案 2 :(得分:1)

两个查询的执行计划在性能方面是相同的。优化器只会丢弃未使用的列。