可能的原因 order by on sql server statement

Possible causes slow order by on sql server statement

我有下一个查询 returns 1550 行。

SELECT *
FROM V_InventoryMovements -- 2 seconds
ORDER BY V_InventoryMovements.TransDate -- 23 seconds

return 结果大约需要 2 秒。 但是当我包含 ORDER BY 子句时,大约需要 23 秒。 这是一个巨大的变化,只是为了添加一个 ORDER BY。

我想知道发生了什么,以及使用 ORDER BY 改进查询的方法。退出 ORDER BY 不应该是解决方案。

这里有一些信息,如果您需要更多信息,请告诉我。

V_InventoryMovements

CREATE VIEW [dbo].[V_InventoryMovements]
AS
SELECT some_fields
FROM FinTime
RIGHT OUTER JOIN V_Outbound ON FinTime.StdDate = dbo.TruncateDate(V_Outbound.TransDate)
LEFT OUTER JOIN ReasonCode_Grouping ON dbo.V_Outbound.ReasonCode = dbo.ReasonCode_Grouping.ReasonCode
LEFT OUTER JOIN Items ON V_Outbound.ITEM = Items.Item
LEFT OUTER JOIN FinTime ON V_Outbound.EventDay = FinTime.StdDate

V_Outbound

CREATE VIEW [dbo].[V_Outbound]
AS
SELECT V_Outbound_WMS.*
FROM V_Outbound_WMS
UNION
SELECT V_Transactions_Calc.*
FROM V_Transactions_Calc

V_OutBound_WMS

CREATE VIEW [dbo].[V_OutBound_WMS]
AS
SELECT some_fields
FROM Transaction_Log
INNER JOIN MFL_StartDate ON Transaction_Log.TransDate >= MFL_StartDate.StartDate
LEFT OUTER JOIN Rack ON Transaction_Log.CHARGE = Rack.CHARGE AND Transaction_Log.CHARGE_LFD = Rack.CHARGE_LFD

V_Transactions_Calc

CREATE VIEW [dbo].[V_Transactions_Calc]
AS
SELECT some_fields
FROM Transactions_Calc
INNER JOIN MFL_StartDate ON dbo.Transactions_Calc.EventDay >= dbo.MFL_StartDate.StartDate

这里我也分享一部分执行计划(可以看到主要成本的部分)。我不知道如何阅读它并改进查询。如果您需要查看执行计划的其余部分,请告诉我。但所有其他部分都是成本的 0%。主要Cost在:Nested Loops (Left Outer Join) Cost 95%.

带 ORDER BY 的执行计划

没有 ORDER BY 的执行计划

我认为简短的回答是优化器以不同的顺序执行以试图最小化排序成本,并且做得很差。正如 GuidoG 所建议的那样,视图中的视图中的视图使它的工作变得非常困难。您也许可以通过创建一些额外的索引或统计信息来说服它以不同的方式执行,但是很难就此提出远程建议。

可能的解决方法是 select 进入临时 table,然后应用顺序:

SELECT *
INTO #temp
FROM V_InventoryMovements; 

SELECT *
FROM #temp
ORDER BY TransDate