在像这样的简单情况下,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;
同样的事情,在每种情况下,优化器都会崩溃到索引扫描并忽略似乎被引用的其他列:
您是否可以依靠这种相同的优化来处理更复杂的查询,我不确定。优化器并不总是完美或可预测的......所以我当然可以设想更多涉及的查询,其中这种崩溃不会可靠地发生。
我不确定我是否理解您所看到的模式的价值。也许那里有一些例子实际上可以达到某种目的。