Sql-Server
儲存過程突然很慢,更新統計資訊沒有幫助
正如標題所說,我有一個儲存過程突然開始執行非常緩慢。以前執行大約需要 5 秒,現在需要 7 分鐘或更長時間。這似乎是在我更改過程時開始的,但我所做的更改不應該影響性能,因為我所做的只是更改返回的兩列的別名。但是,我不確定更改程序是否確實導致了這種情況,因為過去也非常快的類似程序也存在相同的問題。
我嘗試更新相關表的統計資訊,但沒有幫助。上週我遇到了同樣的問題,並且能夠通過這樣做來解決它,但現在不行了。我也嘗試使用
with recompile
無濟於事並刪除該程序然後重新添加它。這是比以前花費更長的時間的行:
select PK_ShipDataSubsystemConfigID ,timestamp ,cast(( select top 1 Longitude from [RemoteServer].[dbo].[Ships].LocationAttributes la inner join [RemoteServer].[dbo].[Ships].Locations l on l.ShipLocationId = la.ShipLocationId where l.SampleDateTime <= timestamp and l.SampleDateTime <= @ToDT and ShipId = @ShipId order by SampleDateTime desc ) as varchar(20)) as Longitude ,'Vessel Position Lng' from FuelCalc inner join ShipDataSubsystemConfig s on s.PK_ShipDataSubsystemConfigID = FuelCalc.FK_ShipDataSubsystemConfigId where timestamp > @FromDT and timestamp < @ToDT and FuelCalc.FK_ShipId = @ShipId order by timestamp desc
現在單獨執行內部選擇至少需要 2 秒,所以我可以理解為什麼整個過程需要這麼長時間。我想知道它是否與呼叫連結伺服器有關。我嘗試創建一個加入 Locations 和 LocationAttributes 表的視圖,以查看它是否有所作為,但它沒有。
有任何想法嗎?我問過我的同事,他們只是說我需要寫一個更有效的查詢(這可能是真的),但我真的不認為這會導致我的特殊問題,因為它工作正常,直到突然它不是. 我查看了執行計劃,但它只是說遠端查詢佔用了 100% 的時間,但並沒有更詳細地顯示該計劃。
我建議您創建一個臨時表或使用公用表表達式從遠端伺服器獲取您需要的所有經度列表,並使用新的臨時表或公用表表達式與您的 FuelCalc 表進行內部連接。
像下面的東西。
WITH CTE as ( select Longitude, MAX(SampleDateTime) as SampleDateTime, ShipLocationId, SHIPiD from [RemoteServer].[dbo].[Ships].LocationAttributes la inner join [RemoteServer].[dbo].[Ships].Locations l on l.ShipLocationId = la.ShipLocationId where l.SampleDateTime <= timestamp and l.SampleDateTime <= @ToDT and ShipId = @ShipId GROUP BY Longitude ) select PK_ShipDataSubsystemConfigID ,timestamp ,cte.Longitude ,'Vessel Position Lng' from FuelCalc inner join ShipDataSubsystemConfig s on s.PK_ShipDataSubsystemConfigID = FuelCalc.FK_ShipDataSubsystemConfigId left outer join cte on cte.SHIPiD = FK_ShipId where timestamp > @FromDT and timestamp < @ToDT and FuelCalc.FK_ShipId = @ShipId order by timestamp desc