使用 AdventureWorks,下面列出了对For each Product get any 1 row of its associated SalesOrderDetail.
使用cross apply它需要14000ms。等效row_number版本仅需要 70 毫秒(快 200 倍)。
cross apply也比inner join所有 Products 和 SalesOrderDetails的简单返回 121317 行(当限制为 TOP 1 时为 266 行)慢。
我更喜欢cross apply这种查询的语法,因为它比row_number版本更简洁。但显然该cross apply版本使用了非常低效的执行计划,而且速度太慢而无法使用。
在我看来,查询没有按预期工作。运行这个简单的查询应该不会花费 14 秒。我cross apply在其他情况下使用过,从来没有遇到过这么慢的事情。我的问题是:这个让查询优化器感到困惑的特定查询呢?是否有任何查询提示可用于帮助它使用最佳执行计划?正如@pacreely 所建议的,我为每个查询添加了统计信息。
--CROSS APPLY ~14000ms
SELECT P.ProductID
,P.Name
,P.ProductNumber
,P.Color
,SOD.SalesOrderID
,SOD.UnitPrice
,SOD.UnitPriceDiscount
,SOD.LineTotal
FROM Production.Product P
CROSS APPLY ( SELECT TOP 1
*
FROM Sales.SalesOrderDetail …Run Code Online (Sandbox Code Playgroud) 我在 Visual Studio 的构建输出中收到了这个相当神秘的消息。没有其他错误,但构建失败。
LC : error LC0000: 'The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)'
Run Code Online (Sandbox Code Playgroud)