我遇到了一个存储过程,它有一些错误。一个是,开发人员这样做了:
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
重复了很多次。所以,我的问题是,通过执行子查询会导致性能下降吗?我知道它没用......最好的想法就是把它弄好 - 我做了。但是,离开它会有任何性能损失吗?
我猜测查询优化器会理解它,做正确的事情?
答案 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;
计划完全相同,运行时指标的差异无法区分。
我还尝试了以下方法,故意选择具有复杂类型的表格(地理位置):
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;
同样,在每种情况下,优化器都会折叠到索引扫描并忽略似乎被引用的其他列:
我是否可以依赖相同的优化来处理更复杂的查询,我不确定。优化器并不总是完美的或可预测的...所以我当然可以设想更多涉及的查询,这种崩溃不会可靠地发生。
我不确定我是否了解您所看到的模式的价值。也许那里有一些实际上有用的例子。
答案 2 :(得分:1)
两个查询的执行计划在性能方面是相同的。优化器只会丢弃未使用的列。